Re: [問題] template metaprogramming的應用範圍
看板C_and_CPP (C/C++)作者dorgonman (dorgonman)時間10年前 (2016/04/02 18:02)推噓1(1推 0噓 0→)留言1則, 1人參與討論串2/2 (看更多)
※ 引述《Clangpp (Clang++)》之銘言:
: 最近一直在看template metaprogramming
: 也看了費式數列的範例,但很多人的介紹也知道這東西很威
: 是turing complete
: 但是小弟我現在還是沒什麼sense,到底如何將平時的
: 東西改寫成這樣或是說可以應用在哪方面。
: 到底sense該如何抓??
: 有請高手指教
: 謝謝
這裡先來說說我自己的理解,有不對的地方還請各位高手指教:)
簡單來說,這玩意就是在編譯期做原本運行期在做的事情,你完全可以不需要用到這個技巧而達到同樣的功能。
例如原本運行期的OO繼承是這樣寫:
class Base{
public:
virtual void someMethod() = 0;
};
class Derived : public Base{
public:
virtual void someMethod() override{};
};
在運行期呼叫裡面的someMethod()的時候需要再去找v-table才有辦法定位置該方法。由於所有事情都在運行時期發生,所以會有一些cost存在。(只要該類別任何一個方法宣告virtual就會建立出v-table)
而用template寫就變成:
template <class Derived>
class Base{
void someMethod(){
static_cast<Derived*>(this)->someMethodImplement();
};
};
class Derived : Base<Derived>{
public:
void someMethodImplement(){};
};
我們可以看到template的寫法把把v-table省略掉了,尋找Derived的動作被移到編譯期上執行,因此在運行期會省一些時間。只是缺點在於寫不好的話會造成code size膨脹到非常大,而且編譯速度也會變慢。為什麼呢?這是因為編譯器會在編譯期幫你把code產生出來,自動產生的code越多,當然code size會越大,而且編譯也會變慢。
你能想像你編譯出來的exe或lib檔大小原本只需要幾KB,但卻膨脹到MB甚至幾GB嗎?好啦,這裡的比喻可能有點誇張,但系統一大起來的話也不是沒有可能。所以寫這個要特別注意code bloat的問題。
其實template metaprogramming在標準庫裡面用的到處都是,要能夠駕馭這套工具其實不是很容易,而且學習門檻還蠻高的。我自己也還在學習路上 : )
好處是學會這套的話,在設計高效率的系統上會很有幫助。
--
Sent from my Windows
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.107.113
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1459591320.A.C83.html
※ 編輯: dorgonman (111.250.80.120), 04/02/2016 18:15:09
推
04/03 11:16, , 1F
04/03 11:16, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章