標籤:

C++的模板元編程是否降低運行效率?

C++引入模板是否是一種犧牲運行效率換取開發效率的一種妥協?謝謝高人回答先。


是的, 沒錯, 降低了g++的執行效率.


我一直隱約有個感覺,但是從來都不是特別清楚這個感覺到底是什麼,直到今天看到了lz的問題我才恍然大悟。

知乎上的C++原來和Quora上的Trump一樣一樣的。


你的問題主要在於讀書不多而想的太多


那玩意大多數時候是犧牲開發效率換運行效率的...

偶爾創造點奇蹟,兩種效率都可以提升


反問:具體來講,你認為它如何影響運行時效率?


寫個c的容器,然後同樣的演算法,用模板寫個cpp的容器,跑下benchmark就造了,絕對是模板效率高


簡單說,可能影響也可能不影響,大部分時候可以忽略

模板的實現是代碼替換,你可以認為它就是升級的宏,單從效率這個問題考慮,跟你手擼重複代碼沒什麼太大區別

要說對效率的影響,是在於代碼膨脹,於是instruction cache可能不是那麼友好,但是考慮到一個程序很可能在大部分時間段都集中使用模板的少數實例,即便程序本身編譯生成了大量實例,這個影響可以忽略

不用模板,也不用重複代碼,大約只能通過繼承介面或基類的方式實現泛型,像java的泛型這樣,然而這種動態性會導致更大性能問題,尤其是對基礎類型(不能用int,只能Integer),性能下降非常厲害

C#中的泛型實現就緩解了java的這個問題


我記得模板原本是用來替代宏的一種自動代碼生成機制,減少重複代碼。至於這是降低還是提高開發/運行效率還是看人吧。

說模板元編程的,模板原本不是用來干這個的好吧,只是恰好能幹而已。模板元寫起來有多麻煩你們造嘛?


元編程表示編譯時計算,我不知道它和運行效率怎麼對比。怎麼算影響運行時效率?要說那個元編程本身輸出的結果而言,肯定就比運行時計算快,因為前者都不存在計算了。


看個例子就明白了吧,下面是Fibonacci數列實現的兩種方法

//遞歸法
int fib(int n)
{
if (n &< 0) return 0; if (n == 1 || n == 2) return 1; return fib(n - 1) + fib(n - 2); } //模板元法 template&
struct temp_fib
{
enum{ res = temp_fib&::res + temp_fib&::res };
};
template&<&>
struct temp_fib&<1&>
{
enum{ res = 1 };
};
template&<&>
struct temp_fib&<2&>
{
enum{ res = 1 };
};

試一下得出運行效率,看看代碼得出開發效率。。。


模版元編程降低的是編譯效率,和運行時關係不大。

降低在哪呢?當年各大軟體公司標配一個團隊,專門負責管理 C++ 編譯任務。

作為對比,Delphi 的編譯快得多,但那編譯器實在太變態,於是到了 64bit 時代就坑了。


不會降低運行時效率

降低的是開發效率(很多模版元編程會有很多意想不到的錯誤)和編譯效率(這是最主要的)(g++那麼慢有很大程度上是因為模版)


完全搞反,難道是日常釣魚


There are two main reasons for using metaprogramming techniques:

? Improved type safety

? Improved run-time performance

- The C++ Programming Language 4th Edition


不會啊 元編程是編譯時計算的 會影響編譯效率 而不影響運行效率

用的好 會提升運行效率啊


推薦閱讀:

如何控制python多線程的退出?
為什麼黑暗之魂3創建了一個新角色之後存檔尺寸沒有發生變化?
Haskell有哪些提高效率的技巧?
哪款滑鼠非常適合編程寫代碼?
將一副撲克(去掉大小王)圍成一圈,使每相鄰四張的和均為 28。若無解,如何證明?

TAG:編程 | C | CC | 模板C |