在哪一点上,模板方法的部分将由编译器优化?请问去掉无法访问的代码,去掉不必要的代码循环? (BITS使用unsigned int类型块,整型使用无符号长的)C++模板优化
另外,有一个C++数据类型,意思是“我是你的处理器登记的大小的整”?
template<size_t bits> class IntegerFactoryImpl : public IntegerFactory<Integer<bits>>{
private:
template<int sizeOfLong, int sizeOfInt> Integer<bits> getOne(const Bits& b) const{
Integer<bits> integer = this->getOne();
size_t roof = (b.blocks() > integer.size()*(sizeOfLong/sizeOfInt))? integer.size()*(sizeOfLong/sizeOfInt) : b.blocks();
for(size_t i = 0; i < roof; ++i){
integer.at(i/(sizeOfLong/sizeOfInt)) = 0;
for(size_t j = 0; j < (sizeOfLong/sizeOfInt); ++j){
if(i % (sizeOfLong/sizeOfInt) == j){
integer.at(i/(sizeOfLong/sizeOfInt)) |= ((unsigned long)b.block(b.blocks()-i-1)) << (sizeOfInt*j);
break;
}
}
}
for(size_t i = roof; i < integer.size()*(sizeOfLong/sizeOfInt); ++i){
if(i % (sizeOfLong/sizeOfInt) == 0){
integer.at(i/(sizeOfLong/sizeOfInt)) = 0;
}
}
return integer;
}
public:
virtual ~IntegerFactoryImpl() throw(){}
virtual Integer<bits> getOne() const{
return Integer<bits>();
}
virtual Integer<bits> getOne(const Bits& b) const{
return this->getOne<sizeof(unsigned long)*8, sizeof(unsigned int)*8>(b);
}
};
会不会有这个代码的差异(没有模板的方法):
template<size_t bits> class IntegerFactoryImpl : public IntegerFactory<Integer<bits>>{
public:
virtual ~IntegerFactoryImpl() throw(){}
virtual Integer<bits> getOne() const{
return Integer<bits>();
}
virtual Integer<bits> getOne(const Bits& b) const{
Integer<bits> integer = this->getOne();
size_t roof = (b.blocks() > integer.size()*((sizeof(unsigned long)/sizeof(unsigned int)))? integer.size()*((sizeof(unsigned long)/sizeof(unsigned int)) : b.blocks();
for(size_t i = 0; i < roof; ++i){
integer.at(i/((sizeof(unsigned long)/sizeof(unsigned int))) = 0;
for(size_t j = 0; j < ((sizeof(unsigned long)/sizeof(unsigned int)); ++j){
if(i % ((sizeof(unsigned long)/sizeof(unsigned int)) == j){
integer.at(i/((sizeof(unsigned long)/sizeof(unsigned int))) |= ((unsigned long)b.block(b.blocks()-i-1)) << ((sizeof(unsigned int)*8)*j);
break;
}
}
}
for(size_t i = roof; i < integer.size()*((sizeof(unsigned long)/sizeof(unsigned int)); ++i){
if(i % ((sizeof(unsigned long)/sizeof(unsigned int)) == 0){
integer.at(i/((sizeof(unsigned long)/sizeof(unsigned int))) = 0;
}
}
return integer;
}
};
(编辑:我刚刚发现的代码无法正常工作(我固定它),但原来的问题仍然适用。)
你试图解决什么问题,这是你的解决方案? – GManNickG 2013-02-21 21:50:54
请参阅http://stackoverflow.com/questions/582302/are-there-optimized-c-compilers-for-template-use – user1929959 2013-02-21 21:52:00
另外,是否有一个C++数据类型,意思是“我是你的大小的整数处理器注册管理机构“。嗯“int”? – SeedmanJ 2013-02-21 21:52:30