2015-04-21 17 views
0

我想知道模板優化。看看示例代碼:如何設置自動優化gcc中模板函數的代碼?

.... 
template <class T> 
T AReallyBigFunction(T); //size = a (MB) 
.... 
int main(){ 
    .... 
    short number1; 
    int number2; 
    long number3; 
    cout << AReallyBigFunction(number1) << endl; 
    cout << AReallyBigFunction(number2) << endl; 
    cout << AReallyBigFunction(number3) << endl; 
    .... 
} 

的問題是:所有三個number1number2number3總是給出正確的結果與AReallyBigFunction<long>,但我不希望通知模板參數long,我不想要繁殖不必要的程序大小,gcc/g ++可以做到嗎?

EDIT的AReallyBigFunction<T>

大小等於一個MB用於每個class T。所以,如果用三種不同的整數類型調用AReallyBigFunction,總大小爲3 * aMB。如果我總是呼叫AReallyBigFunction<long>(模板參數class T已指定爲long),則大小爲MB。我希望編譯器始終調用AReallyBigFunction<long>,儘管我只寫AReallyBigFunction(沒有指定class T,帶有任何整數值(short,intlong))。我的問題是:gcc/g ++是否有解決方案(編譯模式)來響應我?

+1

我不明白你的問題。 –

+0

我想我明白這一點。編譯器可以實現'int'和'long'作爲等價類型。而且你問如果鏈接器碰巧產生相同的機器碼,鏈接器是否爲它們保留單獨的函數? –

+1

如果你說'AReallyBigFunction'可以用'long'參數實現一次,並且當'int'和'short'被提升爲'long'來進行調用時給出正確的結果,那麼就讓你的模板類繼承自一個非模板庫,並實現'AReallyBigFunction'(以及任何其他不依賴於模板參數的方法)。 –

回答

2

如果@DrewDormann的評論是對問題的正確解釋,那麼您可以使用以下技巧來減少代碼大小。

定義函數過載,取值爲intshort,並使用long調用函數模板。

int AReallyBigFunction(int in) 
{ 
    long res = AReallyBigFunction<long>(in); 
    return static_cast<int>(res); 
} 

short AReallyBigFunction(short in) 
{ 
    long res = AReallyBigFunction<long>(in); 
    return static_cast<short>(res); 
} 
+0

我知道這種方式。但是,如果我有很多像'AReallyBigFunction'這樣的函數,我不想定義它們的每個重載 – DMaster