View profile

大山姆的機機車車™ #9

Revue
 
 
May 20 · Issue #9 · View online
《大山姆的機機車車™》電子報
我是山姆,《大山姆的機機車車™》是我的第一份電子報,希望透過這份小報,把我感興趣的資訊分享給同樣求知若渴的您。
本期的主題是一個「古老」的 C++ 技巧-Curiously Recurring Template Patterns (CRTP)。這個技巧不算常用,但學會了,以後使用 C++ 「描述」問題時,是個不錯用的武器。這個技巧常見於[函式,類別]庫的實作,特別是 Header-only Library。
James O. Coplien 於 1995 年提出 CRTP。Mr. Coplien 看過不同人使用類似的手法,有所領悟,將此手法整理成文章解釋這個手法的「迷人」之處。我將該文章 PDF 檔收錄於 Evernote 並載明出處。推薦一讀。
CRTP 是那種看第一眼會被嚇到,心智不健全者可能自我安慰「沒必要搞得這麼複雜」的技巧。這類技巧容易吸引「慣 C 人」嘲諷,遇到時謹記「沒有過於花俏的技術,只有不懂精要的弱魚」,大方「頂」回去!
CRTP 其中一個應用場景是實作 Static Polymorphism,即 Compile-time Polymorphism。有別於 Dynamic Polymorphism(Run-time Polymorphism),Static Polymorphism 的優點之一效能,避免了 Dynamic Dispatch 以及容易 Inline 程式碼,因此常會有顯著的效能提昇(與 Dynamic Polymorphism 相比)。
底下是幾個 C++ 重要觀念,新手越早弄清楚越好:
  • Compile-time vs. Run-time
  • Class vs. Object
  • Value vs. Reference vs. Pointer
  • Scope
try { deliverOnTime(); } catch (const std::exception&) { printf(“sorry!”);}
➫ ➫ ➫ 最近被一個棘手的驅動程式臭蟲搞得心力交瘁,幾乎奮戰了七天七夜,快成「喪屍」還沒把握全身而退。「不怕臭蟲一直來,就怕臭蟲出不來」絕對是軟工最恨排行榜前三。⛈

人物誌
這一期偷個懶,跳過人物觀察…
這隻是多年前在我車窗外短暫停留的飛行物,虎虎生蜂
這隻是多年前在我車窗外短暫停留的飛行物,虎虎生蜂
參兩摘
What the Curiously Recurring Template Pattern can bring to your code - Fluent C++
The Curiously Recurring Template Pattern in C++
ACCU :: Better Encapsulation for the Curiously Recurring Template Pattern
Curiously Recurring Template Pattern - YouTube
CRTP - Curiously Recurring Template Pattern in C++
CppCon 2017: Louis Brandy “Curiously Recurring C++ Bugs at Facebook”
摘影片
CppCon 2017: Andrew Sutton “Meta”
延續 Herb Sutter 的演講,Andrew Sutton 稱 Reflection 為執行時期轉編譯時期的操作, Inject 為編譯時期插入動態時期的操作。
Andrew 的前一場演講 《CppCon 2017: Andrew Sutton “Reflection”》 展示實作 Reflection 概念的介面適合使用樣板,畢竟 C++ 對於編譯時期決定相當熟悉。
這場演講則展示實作 Inject 適合使用動態連結匿名類的機制,這個匿名類跟 Lambda 有點像,因為 Lambda 本身具備 operator , C++20 擷取子句能使用 this 。
By Sidney Niu
CppCon 2017: Andrew Sutton “Meta” - YouTube
Understanding compiler optimization
編譯器優化最重要的演講肯定是這場,這題目是連續三年的 keynote presentation。
Clang AST 轉成 LLVM IR 之後在優化前首要解決的問題是 Canonicalization,C++ 擁有大量特性導致同樣結果的寫法可以千變萬化,而 Clang 在近年大幅成長也是因為解決了此問題。
最後 IR 轉成控制流程圖,這裡是優化演算法的核心,先優化有向圖的最末端迴圈區,一路解開至進入點,此優化系統方法讓 Clang 成為目前地表最強的 C++ 編譯器。
這些演算法主要跟谷歌大力投入有關,微軟也讓 VS15 高度支援 Clang 。 當初 GCC 從 C 語言換成 C++ 是因為 Ian Lance Taylor 說 C++ 效能與維護性都比 C 好 (Write gcc in C++),但是近年 GNU 很明顯人力吃緊導致實作速度明顯跟不上標準,還被 Ian 說〝FSF is not writing code.〞。
中英對照:控制流程圖(Control Flow Graph)
By Sidney Niu
code::dive 2016 conference – Chandler Carruth – Understanding compiler optimization
Handmade Hero Chat 014 - CRTP and Library Design
第一期的人物 Casey Muratori 的《Handmade Hero》系列影片第 014 集,以遊戲開發的角度出發說明 CRTP 的寫法與用法。觀看需要有點基礎,C++ 新手勿入。
Handmade Hero Chat 014 - CRTP and Library Design
開源專案
loguru: A lightweight C++ logging library
WorkFlowy Tips
[077] WorkFlowy 外掛 WorkFlowy Clipper
想知道更多 WorkFlowy 撇步,請快步前往 WorkFlowy Tips 。還沒有 WorkFlowy 帳號?請用此連結申請,加倍免費清單上限。
還有還有,我在臉書開了一個以 WorkFlowy 為主題的社團——山姆的 WorkFlowy 大小撇步現在人很少,快來助拳!
💌 喜歡這一期的內容,請幫我按「👍」。不喜歡請按「👎」,並寫下你認為哪裡做得不好,你的回饋是我進步的動力。想要匿名舉報的話,我開了一個 Sarahah,歡迎使用,謝謝!
本報內含 Affiliate Link 連結若干,也就是我有機會從中獲益,賺點奶粉錢,希望有朝一日能因此日進斗金(誤)。若對這樣的作法有疑慮,請讓我知道或者直接退訂也行,我不會介意,你請別生氣。☯
JUST DO!
Why You Should Practice Being Stupid, Dumb, Unthinking | Benedict Cumberbatch
Did you enjoy this issue?
In order to unsubscribe, click here.
If you were forwarded this newsletter and you like it, you can subscribe here.
Powered by Revue