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就可以聲明友元,模闆中也可使用;模闆函數也支持了默認參數;顯式模闆實例化和外部模闆聲明優化鍊接;匿名和局部的類/結構體等,都可以作為模闆實參,我來為大家科普一下關于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實現也是可以的)。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!