讀《STL 原始碼剖析》及感悟
阿新 • • 發佈:2019-01-08
買這本書有一段時間了,斷斷續續的,我對這方面的興趣也不是特別大,很早之前看過了《深入實踐C++ 模板程式設計》、《深入理解C++11 :C++11 新特性解析與應用》,而且,經過這兩年的工作時間使用C++,我也認識到,一些技術層面的問題並不是那麼重要,研究好了C++的機制和trick,對於專案而言幫助也不是最關鍵的。所以,我的關注重點還是停留在去了解了C++程式的高效性同時保有了強大的表述能力,不得不佩服C++委員會。
我忘記了在哪裡看到過這樣的一句評論:STL是給庫的作者準備的,普通的開發者只需要使用即可。以我的經驗,我深深的認可了這個意見。倒不是說上層開發者就不去研究STL,我只是覺得,對STL的研究和學習,不應該成為上層開發者的主要目標和引以為傲的能力。也不是職業生涯中的都不需要研究STL了。我所說的不建議深入,是指工作時間不長,沒有寫底層lib需求,甚至連上層業務如何實現都還沒有摸清的人,應該把關注的重點放在程式的功能究竟如何才能實現,更好更穩定的執行,而不是給一個功能設計加上了諸多限制條件,以試圖優化程式碼讓程式跑的更快。一些人批評STL慢,當然,它當然是慢的,甚至都沒有tbb的多執行緒安全的容器快,但是,你使用了tbb之後就懵逼了,這東西完全無法除錯啊。我認為,不應該是你覺得STL的一些容器慢了或者浪費記憶體了,就試圖寫一個類似的模板容器出來,試圖證明自己比STL的諸多作者更加牛逼,而是意識到STL的通用性和必然的限制,簡單的繞過限制和避免最壞情形即可。從這個面上講,也是有必要去學習STL的。總結一些,學習一個東西並不一定是為了自己就能夠寫出一個更加牛逼的,大多數情況下,你也是做不到的。
說當下吧,這兩年,我們的CAD程式都是使用原生的C++開發的,Qt做介面,演算法部分重點在物理引擎和渲染引擎。物理引擎所處理的業務簡單,無需複雜抽象,簡單的幾個類就可以了,一些演算法部分其實都是C函式,class只是作為一個namespace來用而已。 渲染部分,都是用shader做,和C++也沒有什麼關係,大多是資料的封裝而已,根本無需複雜的C++特性。CAD部分是有很多業務需要C++來做業務抽象,我們CAD團隊成員都有深厚的CAD從業經驗,多浙大等名校畢業,碩士研究方向也是符合,但是,早期的設計過分強調效能和某些指標,導致現在的程式碼凌亂(再次強調:創業階段,特別是帶有創新技術的專案,最重要的事情是把東西做出來,做出來可執行的東西就是最牛逼的),C++模版之類的技術都不大用的上。因為模版的表述能力比類更加高階,如果連面向物件都沒有做好,何談更加高階的抽象。也不要總是把C比C++執行的更快掛在嘴上,這顯得你沒有技術深度了。一個好的程式設計師並不會關心C++比Java程式執行的更快,因為,這兩個東西基本上沒有什麼可比性。Android
NDK剛出來的時候,就遇到有人挺推崇這個的,我看了一眼就不建議研究,這根本與大方向不符,這點效能提升也沒什麼用途,浪費的是更多工程上的時間。以上是我的一點總結。希望引起看到的人一點思考。
老筆記重發
P.S. 我對語言研究還是保有很大期望的,雖然,現在因為工作職責的原因,沒有時間來做這方面的工作。計算機程式語言研究,本質上是數學集合論的研究。《形式語言,自動機理論與計算導論》中第一章就指出“Languages and problems are really the same thing"。我們現在使用主流的程式語言如Java、C++實現各種數學模型來做機器學習和人工只能的程式,數學模型就是演算法,這幾年也是因為數學模型的改變才是程式做到更厲害的工作。日本曾花費巨大的搞了第五代語言的研究,結果也並沒有什麼產出。可見,程式語言研究上的難度。還是希望能有更好的研究結果出現吧。