c++項目實戰:c++ boost線程命名

I、保持語言的穩定性和兼容性」 總結:主要是utf8字元串,虛函數override/final支持。 1、c++11宏和類型(考慮和c99兼容):STDC_HOSTED、STDC、__VA_ARGS__宏可以替代…、__cplusplus宏用於c和c++混編,非布爾值還可以判斷是否支持c++ 11;_Pragma操作符。 long long 64bit類型, static_assert用於編譯時警告,表達式必須是常量。string都是utf-8類型的,可以和utf-16,char*等轉換。可用sizeof(類::非靜態成員)獲取成員大小。 2、面向對象語言特性完善:虛函數override/final支持;增加非靜態成員變數就地初始化=和{}符號;noexcept函數聲明沒有異常拋出,如果拋出了則用std::terminate()來終止程序; 3、完善拓展模板語法:friend FriendClass就可以聲明友元,模板中也可使用;模板函數也支持了默認參數;顯式模板實例化和外部模板聲明優化鏈接;匿名和局部的類/結構體等,都可以作為模板實參。

II、「通用為本,專用為末」 總結:主要是右值引用,移動語義,完美轉發的引入。 1、對性能的更加關注,和C高效兼容:引入右值引用類型,函數模板完美轉發實現;和C語言的兼容,pod類型的定義;聯合體的拓展。 2、面向對象編寫要更加高效和簡單:移動構造函數,移動語義;繼承構造函數和構造函數委派; explict拓展到類型轉換函數;類型初始化列表的支持。 3、完善拓展泛型編程語法:inline名字空間允許父空間中對模板重定義;using別名可以用於模板和實例化模板;實例化模板時對SFINAE原則拓展,允許模板參數中存在非實例化的表達式存在。

III、「易學易用」 總結:主要是是類型推導規則引入,for自動範圍和迭代引入。 1、基礎符號編譯器增強:1).>>避免模板或類型轉換中需添加額外的空格。2).for(auto &e: containerObj){}自動範圍和迭代語句,數組和STL容器都支持(stl中e是元素類型),自定義容器需重載。 2、新增了類型推導規則: 1).auto編譯期類型多用於函數或表達式內部的變數,不能用於函數參數,類成員,數組和模板實例化中(雖然提供值),可以用於初始化列表和new對象中。會去掉volatile和const修飾符。 2).decltype是最靈活的編譯期類型,根據表達式而不是只推導類型,可以用在所有表達式類型確定的地方(函數返回值是不確定的),可以帶走volatile和const修飾符。左值判斷技巧。 auto可以減少代碼量,decltype可以更靈活的獲得表達式運算後的類型,他們都有類型自適應性(值修改後類型不用變),可以多用於庫相關代碼的編寫。業務邏輯用確定類型會清晰些。 3、追蹤返回類型,auto和decltype的結合,auto Sum(T1 &t1, T2 &t2) -> decltype(t1+t2) { return t1+t2}能確定運算後變化的類型,增強函數和函數指針泛型能力。

IV 、「提高類型安全” 總結: 1、新枚舉類型:新增了enum class enumName:type{}作用域限定符和類型。 2、智能指針:unique_ptr用在單模塊內使用,shared_ptr和weak_ptr用引用計數在多個模塊間共享。記得初始化;判是否有效,*和->使用,需轉換為原指針迭代跳轉;move或reset後要小心使用。 3、GC: 標記-清除GC實現,現在暫時定義了介面,原因是指針的太靈活(指針任意在內存中跳轉)導致隱藏指針,GC會誤刪,用declare_reachable等標記隱藏指針解決,且delete和回收是兼容的。

V、”提高性能及其操作硬體的能力「 總結: 1、1)constexpr是編譯期常量,constexpr元編程的引入;2)變長參數模板類和函數模板,庫編寫用簡單實例思維解決,非庫編寫者用tuple和容器的emplace系列函數即可。元編程對庫程序員是一種簡化,而不是複雜化。 2、並行編程: 1)原子類型:atomic定義基本類型,自定義類型用_Atomic實現(現在還不支持),原子類型是編譯器用了系統底層的匯流排鎖或存儲鎖加快鎖定,其它同時訪問線程會被阻塞,atomic_flag自旋無鎖同步,memory_order對弱順序代碼執行內存模型調優,是cpp11並行編程中的一大亮點。 2).多線程庫引入:cpp11內置的線程其實是封裝了pthread線程,使用更加簡單,但是沒有pthread底層和控制能力強。 3).TLS變數,對全局靜態常量數據和線程生命期綁定,關鍵字是thread_local。cpp11 errno變數是線程局部的而不是全局的。 3、進程退出:用quick_exit需要退出回調的用at_quick_exit(目前LLVM還沒實現);異常退出還是要terminate實現。

VI 、”為改變思考方式而改變「 總結: 1、nullptr引入,用單一職責思維,避免NULL存在指針和整型的二義性,nullptr_t類型可以進行賦值到指針和進行比較運算(與指針的)。 2、=default恢復編譯器默認的函數,方便書寫和保證POD類型;=delete指定刪除,方便禁止一些拷貝構造賦值和移動拷貝構造賦值函數,全局和普通函數的某個重載版本也可以禁止。 3、lambda函數編程的引入,注意捕獲列表中傳值和傳引用區別(都是定義初始化仿函數閉包對象,但是&可獲得調用時上下文值,&自定義類型性能更高,但要小心使用)。在stl仿函數,泛型編程,複雜函數中作為匿名函數廣泛使用。lambda相比仿函數還是有區別的,只能函數內部初始化和使用,自定義仿函數和普通函數可以在不同作用域初始化和使用,所以使用時候區分就好。

VII、融入實際應用” 總結: 1、alignas是設置變數的對齊大小,alignof是獲取變數的對齊大小,可以單獨對變數對齊進行設置;stl庫裡面的align函數,aligned_storage和aligned_union模板對內存塊進行對齊調整。 2、通用屬性,cpp11引入的[[noreturn]](用在異常,終止,無限循環函數中)和[[carries_dependency]](用在弱內存模型並行編程中)屬性聲明符號。 3、Unicode字元串,1)cpp11中默認的string 是utf8編碼,存儲省空間,增刪查找也是可以的(utf16更加方便些),計算文字數需轉換到u16string。 2)c++11對於字元轉換用基於locale的codecvt,也可以直接用wstring_convert配合codecvt_utf8_utf16等直接進行轉換,注意utf16有大小端。 3)輸出時候的一些設置,內部會調用設置相關的函數,cpp98添加了wifstream和wofstream類,但是cpp11沒有u16ifstream和u32ofstream等,需要轉換到更節省的utf8類型。 4)原生字元串字面量,語法R」()」,但是轉義字元不能再使用。

VIII、c++11和boost關係,boost的使用:

你可以大致看下C++11比C++03多了什麼。那些東西很多都是從boost庫里拉過去的。主要是智能指針、線程、hash數據結構。

正則表達式,另外,boost裡面還有filesystem我認為比較實用。

盡量使用c++11,在使用boost可以獲得比較方便的方案時候,可以採用boost,如:filesystem,date_time(其實用cpp11實現也是可以的)。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/224333.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:37
下一篇 2024-12-09 14:37

相關推薦

發表回復

登錄後才能評論