2013-02-21 79 views
0

在哪一點上,模板方法的部分將由編譯器優化?請問去掉無法訪問的代碼去掉不必要的代碼循環(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; 
    } 
}; 

(編輯:我剛剛發現的代碼無法正常工作(我固定它),但原來的問題仍然適用。)

+0

你試圖解決什麼問題,這是你的解決方案? – GManNickG 2013-02-21 21:50:54

+0

請參閱http://stackoverflow.com/questions/582302/are-there-optimized-c-compilers-for-template-use – user1929959 2013-02-21 21:52:00

+4

另外,是否有一個C++數據類型,意思是「我是你的大小的整數處理器註冊管理機構「。嗯「int」? – SeedmanJ 2013-02-21 21:52:30

回答

1

權,編譯器將優化掉的東西,它可以在編譯時計算,如果你有一個循環,只有一次迭代(如for(i = 0; i < 1; i++),將徹底消除環路。

至於整數大小,如果使用longint更好,它取決於你試圖達到的目標。例如,在x86-64中,一個64位操作需要一個額外的字節來表示後面的指令是一個64位指令,而不是一個32位指令。如果編譯器產生64位長的代碼,代碼會變得更大一點,因此不適合緩存等。在16,32或64位操作之間沒有速度優勢[對於99%的操作,乘法和除法是一些明顯的例外 - 數字越大,分割或乘法所需的時間就越長((實際上,數字中SET的位數影響乘法時間,而I相信鴻溝))]在x86-64。當然,例如,如果您使用這些值執行位掩碼操作等,則使用long將爲您提供64位操作,這些操作只需執行一半操作即可執行相同操作。這顯然是一個優勢。所以在這種情況下使用long是「正確的」,即使每條指令增加了一個額外的字節。

還要記住,很多時候,int用於「小數字」,所以對很多事情的int額外的尺寸只會被浪費,並採取了額外的數據緩存空間,等等,等等。因此,int仍然保持32位,以保持大整數數組的大小,並且具有合理的大小。

+0

所以編譯器應該知道sizeof()返回值? – 2013-02-21 22:15:41

+0

另外,這個實現和另一個區別在哪裏,我簡單地用(sizeOf(xxx)* 8)替換(參見上面的編輯)sizeOfxxx模板參數? – 2013-02-21 22:21:44

+0

是的,編譯器當然知道'sizeof'產生了什麼。它知道如何乘,除,整數(通常是浮點數)。 – 2013-02-21 22:26:53