Re: [問題] template metaprogramming的應用範圍

看板C_and_CPP (C/C++)作者 (dorgonman)時間10年前 (2016/04/02 18:02), 10年前編輯推噓1(100)
留言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
這是CRTP,TMP中的一種static polymorphism應用
04/03 11:16, 1F
文章代碼(AID): #1M_vYOo3 (C_and_CPP)
文章代碼(AID): #1M_vYOo3 (C_and_CPP)