簡體   English   中英

在模板中鍵入獨立代碼

[英]Type independent code in templates

我想知道如果編譯器實例化模板函數(或類模板的方法)會發生什么。 看下面的(毫無意義的)例子:

template <typename T> T DoSomething(T t)
{
   int i = ToInt<T>(t);
   string s = ToString<T>(t);

   cout << i << endl;
   // ... some more non-type specific code
   cout << s << endl;

   return DoLast<T>(t);
}

只考慮前兩行和最后一行在T上考慮其實際類型。 中間的代碼不是特定於類型的。 現在我這樣做:

DoSomething<int>(1);
DoSomething<double>(1);

AFAIK這會導致編譯器在編譯時將模板實例化兩次,這意味着它會創建兩者的副本,特定於類型的代碼和非特定於類型的代碼。 但是,非類型特定代碼不需要復制,因為它獨立於T.

我應該手動優化它,在單獨的函數中移動類型無關的代碼,還是C ++標准或編譯器優化器(特別是VS)中有什么我可以信賴的?

編輯:關於優化......我知道時間與內存的權衡。 我假設大多數優化器都試圖根據它們的設置來平衡兩者。 我的問題主要是關於大部分類型獨立代碼和一個小類型特定部分,可能額外的調用將是一個很好的協議。

與任何性能和優化問題一樣,為您的案例獲得明確答案的唯一方法是同時實施,分析和比較結果。

盡管如此,我仍然會說你認為“優化”可能並不是真的。 優化者現在做的一個非常重要的優化就是調用內聯 - 這恰恰你想要做的相反 通常,通過將函數體復制到調用站點並消除函數調用開銷來提高性能。 當然,這會導致大量的代碼倍增,但優化者知道什么時候這很重要。 大多數情況下,代碼大小的增加根本不會影響性能。

您應該查看編譯器編譯的程序集,以了解正在執行的操作。

話雖如此,很可能是類型無關的代碼生成一個獨立的可重用包,所以無論如何,將它放在一個單獨的函數中可能是有意義的,無論成本或利潤是多少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM