簡體   English   中英

模板類的許多實例會影響性能嗎?

[英]Do many instantiations of template class affect performance?

我的設計有兩個選擇。 一種是使用一個帶有參數的類

A::A(int i)

另一種是使用模板

A<i>

我有很多對象A <1>(),A <2>()等等。 我想知道第二種方式是否會顯着影響執行和編譯性能。

除非你需要,否則你永遠不應該做異國情調(我認為非類型模板參數有點異國情調)。 您可以隨時回去以后重構,如果你需要改進的速度,大小,編譯時間等話雖這么說, 什么區別?

通過聲明一堆模板類,您基本上可以使用該參數一遍又一遍地復制粘貼類定義。 這有一些影響:

編譯和鏈接時間:

您不僅要聲明N個類,模板也不能將它們的主體分成翻譯單元。 這意味着在使用它們的每個翻譯單元中,它們都被實例化。 這可能會大大減慢編譯和鏈接時間。

代碼大小和碎片:

因為每個類都是獨立的,所以每個類都有自己的功能。 這通常會導致代碼大小的增加,因為即使代碼非常相似,它們也是具有自己的成員函數的獨立類型。 由於緩存,代碼大小的增加也會對性能產生負面影響,因為必須加載更多代碼才能保持程序的流失。

限制:

因為類將是它們自己的類型,所以模板化的類將不會彼此“知道”。 它們不能存儲在相同的數組,向量,列表,映射等中。您可以執行一些多態魔術來存儲指向共享庫的指針,但是一堆指針通常比本地化的數組或向量執行得更糟。 您也無法根據輸入執行任何A的運行時構造。 這可能適用也可能不適用,但也要考慮未來。 請問你絕對不會需要根據一些運行時變量來構建? 請問你絕對不會需要持有的數組A地方?

編譯論證的時間知識:

現在這是一個主要的好處。 你知道i在編譯時。 這意味着你可以做一些非常漂亮的事情。 使用C ++ 11,您可以編寫constexpr方程式(或者在C ++ 14中,更漂亮的constexpr方程式。)您可以在編譯時進行metatemplate編程以創建其他東西。 這導致一些獨特的情況,可以減少主要復雜性和編譯/鏈接時間成本的執行時間。 但在某些情況下,這是必要的。 盡管剖析也告訴我,但我絕不會采用涉及此問題的解決方案。

暫無
暫無

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

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