簡體   English   中英

class 模板實例化的數量

[英]Number of class template instantiations

我想知道您是否應該擔心 class 模板實例化的數量及其對編譯時間的影響。 在下面的例子中, 我想象 Foo 模板只會被實例化一次 ,而 Bar 模板會被實例化兩次。 這樣的差異對 STL 作家有影響嗎?

template<unsigned SIZE>
struct Foo
{
    const unsigned size_;
    Foo() : size_(SIZE) {}
};

Foo<1> foo1;
Foo<2> foo2;

template<unsigned SIZE>
struct Bar
{
    static constexpr unsigned size_{SIZE};
};

Bar<1> bar1;
Bar<2> bar2;

我覺得 Foo 模板只實例化一次是錯誤的。 如果是的話,你能告訴我是否

Bar<1> bar1;
Bar<1> bar2
...
Bar<1> bar10000;

將實例化Bar模板一次或 10,000 次。

Class 模板實例化類型,類型實例化對象,如果實例化對象的數量保持不變,減少實例化類型的數量是否重要?

這些事情甚至與編譯時間相關嗎(我懷疑它們是否符合我的目的)

所以簡單的答案是模板代碼的生成(以及后續的編譯)將為您創建的每種類型發生。 所以在這個例子中:

Bar<1> bar1;
Bar<1> bar2
...
Bar<1> bar10000;

其中每一個都是Bar<1>類型,因此您只需為Bar<1>生成一次代碼。 您可以在cpp 洞察工具中看到這一點。

但是,如果您在代碼庫中使用它,這將改變。 請記住,包含此 header 的每個翻譯單元(有點類似於 cpp 文件)將為使用它們的任何數字重新定義類型BarFoo 如果是這種情況,您可能會發現您的代碼被大量生成和編譯。 對於這個無關緊要的簡單模板,但對於可能依賴於其他模板的更復雜的模板,這可以快速加起來。

實際上你正在創建對象: Bar<1> bar1; 條 <1> bar2... 條 <1> bar10000; 10000 次 => 在運行時實例化。 不在編譯期間。 編譯器用於編譯、檢查程序、創建可執行文件。 一旦編譯沒有任何錯誤,在執行過程中,對象是基於代碼流創建的。 在創建對象以在運行時處理性能問題(如果有)時處理 memory 管理。 您可以使用以下方法識別:(示例:) cout 在構造函數中了解構造函數被調用的次數。

暫無
暫無

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

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