最近一段時間 c++ 社區裏最火熱的話題莫過於 cppcon2015 了, isocpp 上一堆相關的新聞,其中有一個頁面羅列了該會議的所有主題, 匆匆一瞥幾乎眼花繚亂,爲期一個星期的會議竟有上百個演講,不管是數量仍是內容所覆蓋的範圍,比之去年都更加豐富,做爲一個野生的 c++ 的愛好者,我表示這樣的盛會是不容錯過的,多麼但願能有機會前往現場感覺一番,門票倒不是太貴,惋惜遠隔重洋,只能灑淚遙望。如今 cppcon 已過去一個多星期了,演講的視頻和材料還沒所有公開,isocpp 上說要一個月的時間才能搞好,只能耐心等,目前放出來的只有少數幾個演講,好比,由 Bjarne Stroustrup 和 Herb Sutter 主講的:Writing Good C++14,因而趁着假期虔誠地拜讀一番,給信仰充充值。html
忽然想起來,去年的 cppcon 也放出了不少演講視頻,我只略看了其中一小部分,當時 c++11 用的還比較少,不少東西都沒接觸,所以有些視頻沒細看,有的沒看懂,如今一年多過去了,不少東西有了不少新的體會,以爲卻是時候回顧一下去年這些人都講了些什麼東西,因而翻啊翻,重看了一些關於網絡,併發,類型,模板等相關的演講,收穫不少,這些演講的主題大部分並非教別人怎麼寫代碼或介紹新特性之類的,不少是工程實踐中的經驗總結,以及 show off 一下自家的編程思想,工具等好東西諸如此類。愈來愈以爲多關注一下業界的動態,瞭解一下別人在作什麼、怎麼作的,對開闊一我的的思路和眼界實在有莫大的幫助。linux
只是不少時候不少東西看過就丟開了,再找時東翻西翻,缺乏整理就以爲混亂,因此這篇筆記就隨手整理歸類一下近一年多看了些什麼 c++ 相關的東西,記錄記錄,也方便須要時去查找回顧,僅此而已。c++
該主題的內容比較難理解也難以使用,特別是當你想寫 lock free code 時。最好的教程我以爲來自於委員會裏這方面權威人士的手筆,好比: Herb Sutter, Hans Boehm, 推薦兩個視頻,都在 msdn chanel9 上:git
看完前面兩個視頻,估計就能對 c++11 裏的 threading 和 atomic 相關的庫有大概的瞭解,不過與此同時估計讀者腦海裏也多了一堆對技術細節的疑問,尤爲是 ordering 相關的,此時能夠再去看看如下兩個長篇,其中一篇是講硬件實現上的細節,a primer on memory consistency and cache coherence,另外一篇則介紹了 linux 內核中 memory barrier 的相關知識與背景程序員
若是你實在很好學,追求極致細節想成爲 language lawyer 什麼的,這裏幾個連接,分別是 Hans 和 Herb 當初給 c++ 委員會做的原始提案,細看一下就能知道如今 c++11/14 裏相關內容的是怎麼來的:github
上面的連接都來自權威人士,其中文章大多很是嚴謹於是可能不夠通俗易懂,國外有一位叫 Jeff Preshing 的遊戲開發者寫了一系列與 memory ordering 相關的博文,他的文章寫的很詳細,每一個概念都有長篇的介紹及相關的代碼,若是你看完 Herb 和 Hans 的那些文章後仍是有疑問,那麼能夠嘗試再結合一下 Jeff Preshing 的文章來加深一下理解,特別是其中關於 acquire-release, happen-before 及 synchronize-with 這幾篇。web
最後有一本書介紹給讀者,C++ Concurrency in Action,學以至用,做者也是這方面的先行者 Anthony Williams,他的文章博客在網上也傳播的很利害,好比 Peterson's algo,Deker's algo 在 c++11 中的實現等。sql
雖然 BS 諄諄教導不要成爲 language lawyer,不要摳太多語言細節,可是。。。不完全搞懂右值引用又怎麼可以理解 move 語義,又怎麼能用好新的 STL 呢,更不用說本身寫相關的代碼了,畢竟語言裏自己有許多 arcane 的細節,弄懂了其實仍是有助於少踩坑的,再說了,不能寫 library 的程序員也算不得好碼農。express
右值引用是必定要搞懂的,推薦兩篇介紹性的長文,其中一篇是 Scott Meyers 寫的 Universal References in C++11, 另外一篇則由 Thomas Becker 所寫 C++ Rvalue References Explained,仔細讀完這兩篇文章,應該就能完全搞懂 move, forward 及其背後那些稀奇古怪的東西。編程
由於右值引用的出現,c++11 裏對傳參有了一種新的寫法(idiom),叫做 sink parameter,簡單來講就是必要狀況下儘量多地傳值而非傳引用,具體能夠看看這篇介紹, 由此也引起了許多對 value semantic 的討論,cpp-next 上有一篇文章值得一讀,want speed? pass by value(連接若是無法打開,能夠試試這個備份的鏡像), Sean Parent 有一個 talk: c++ seasoning 也講到了這方面的用法,cppcon2014 裏有也有一個專門的演講是談 value type 的,我的以爲比較有意思。
在學習右值引用的時候,若是你在乎細節,相信會遇到一些關於類型推導的疑問(好比 perfect forwarding 裏的模板參數類型推導)。關於類型的推導,好比 auto, decltype 的使用,這裏也有兩篇文檔值得一讀,很巧分別仍是 Scott Meyers 和 Thomas Becker 所寫,其中一篇是 Scott 在 cppcon2014 上做的演講,Type deduction and why you care, 另外一篇則是 Thomas 寫的 C++ auto and decltype Explained,題外話,auto 和 decltype 是 c++11 裏我最喜歡的兩個新特性了,auto 自沒必要說,隨手 auto 一下強健的右手少敲多少鍵盤,decltype 也是實打實的 productivity booster,之前要寫各類 traits, result of 來人肉推導返回類型的痛苦歲月今後就一去不復返了。至於模板參數的類型推導,我的以爲也是值得仔細研究總結一下的,之後再補充.(TODO)
語言級別的併發編程也許是 c++11 衆多的新特性中引入新概念最多的一塊了吧,習慣了從前遠古時代簡單粗暴的多線程編程模式,到如今滿眼 future, promise, async,恍惚會有錯覺彷彿已經不是在寫 c++,感受已經變了,味道也變了。確實是變了,變得更加簡單,也變得更加容易,因此最好儘早去嘗試和適應,熟悉了基本的語法和使用規則以後,強烈推薦 Sean Parent 的這個演講,better code: concurrency, 這裏面 Sean Parent 講了一些併發編程的基本的準則,best practise 之類的,而且本身重造了一遍 future, promise, packaged_task 等輪子,從而實現了一個簡單版的 async continuation (主要是 then()),Sean 的演講和他的程序同樣一慣地簡練實際,我我的很是地喜歡,也推薦讀者去看看他的 better code 這一系列的演講,乾貨不少。
說到 concurrency,Herb Sutter 也寫了一系列 effective concurrency 的文章,固然一慣地 Herb 的風格了,以說教的形式指出 best practice,若是嫌文章太多太長(我也沒看完),能夠看看他的這個濃縮版的演講,該演講把 future, promise, async, then 等方方面面都講到了。我的小小的體會,async 加上 lambda,你會發現 c++ 裏寫 non-blocking code 突然變得這樣直接和容易,簡直不敢想像。
另外就是關於 coroutine,微軟的人在 cppcon2014 上展現了一個在 vc 中實現的 await2,貌似和 c# 中的 await 有些關聯??從他們的演講來看,await2 能夠 stackless,所以 highly scalable, 細節是怎樣的,十分值得細究,基於 await 的編程看起來又徹底不一樣的感受了,不少其它高級語言裏特性逐漸地出如今了 c++ 裏面。
lambda 並非一個新的東西,就算在 c++11 中,它的出現也這樣地瓜熟蒂落,甚至能夠認爲不過就是 functor 的語法糖,可是它的誕生在不少狀況下卻讓寫代碼變得這樣的簡單直接,以至若是你深刻體驗以後,已經徹底無法再脫離它,前面 Sean Parent 關於 concurrency 的演講裏面就有不少這方面的例子,另外一個活生生的例子能夠參看一下 Andrei Alexandrescu 的這個演講: systematic error handling in c++,看看 lambda 是怎樣使得 scope guard 在 c++11 裏的實現變得這樣簡潔與實用。說到 scope guard,如能靈活地使用起來,這東西的確在不少時候可使得程序的控制流更直接更可讀,看看 Andrei 在 cppcon 上的這個演講。
對於模板,變長參數的加入極大地簡化了模板元編程,之前不少須要使用許多死板的宏技巧才能實現的功能,如今已經能夠很輕鬆地用 variadic template 來實現了, 這裏有一個入門的教程,Andrei Alexandrescu 也在這方面有一個演講(這個題目怎麼少得了他):Variadic Templates are Funadic,Andrei 的演講不管是內容仍是風格一如既往讓人傾倒,鼓勵你們前去圍觀。除了變長參數,c++11 中也加入了一系列其它的模板基礎設施,好比更加豐富的 type traits, SFINAE 等,c++ 委員會裏一位資格極老的成員 Walter Brown 在 cppcon2014 上做了一個這方面的演講,不過這裏面主要側重在 SFINAE 了。
說到模板,回想起一年前使用 boost spirit 和 boost proto 所經受的完全洗禮與摧殘,如今仍覺受益不淺,我以爲喜歡搞模板的人不嘗試一下 expression template, 不玩一下 proto 那他的人生是不完整的,cpp-next 有 proto 的做者 Eric Niebler 寫的一系列文章:Expressive C++(若是打不開,嘗試這個備份的鏡像,十分值得一讀,若是讀了一兩遍沒搞懂,不要緊,多看幾遍,你可能會發現仍是沒徹底搞懂也不奇怪, 看過這一系列文章,若是你還有興趣,cppcon2014 上還有一個更好玩的,HANA: EXPRESSIVE METAPROGRAMMING,enjoy.
最近在 cppcon2014 上發現了一個挺有意思的項目,也是和模板相關的,sqlpp11,這個項目利用 expression template 在 c++11 基礎上實現了一個 sql library,創意程度直逼 boost spirit,關鍵是,它至關地實用,所以實在值得學習借鑑。
最後是關於 functional,是的,functional programming,一聽就高大上,buzzword 火熱如同當紅炸子雞,functional programming via c++ 也許有點牽強,functional programming via c++11,看起來卻有所不同了,practical functional programming,看看別人都在想什麼都在玩什麼。。。其實話說回來,這些都不新鮮,boost 庫中相關的庫 fusion 和 phoenix,已經存在很長一段時間了,只是你關注到了沒有而已。
TODO