天天看點

《Visual C++ 2012 開發權威指南》——2.3 Visual C++2012的語言新特性(3)

本節書摘來自異步社群出版社《visual c++ 2012 開發權威指南》一書中的第2章,第2.3節,作者: 尹成 , 朱景堯 , 孫明龍 , 胡耀文,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

在vc12(visual c++2012),我們打算完全支援c++11标準庫,但實施編譯器功能可以自定義(另外,vc12不會完全實作c99标準庫,已經通過引用納入c++11标準庫。注意本頁和vc12已經有)。這裡是我們不斷的變化的非詳盡清單:

新頭檔案:、、、、、、和。

進駐:根據需要由c++11,我們已經實作了emplace()/emplacefront()/emplace_back()/ emplace hint()/emplace_after()在所有容器的"任意"數字的參數(見下文)。例如,矢量有"模闆< typename…args > 無效emplace_back(args & & …args)"的直接構造任意數量的任意參數,完美轉發從向量的背部t類型的元素。這可以更有效地比push_back(t&&)(本頁支援1的參數,并不是特别有用的侵位)。

人造variadics:我們開發了一種新的模拟variadic模闆方案。以前在vc9 sp1和頁本頁,我們一再包括subheaders在定義不同的每一次,為了杜絕為0、1、2、3,等參數的重載的宏(例如, 包含内部subheader 反複,為了杜絕make_shared (args,args,args))。在vc12,subheaders已經過去了。現在我們variadic模闆本身定義為宏(帶有大量的反斜杠延續),然後将其展開主宏。此内部實作更改具有某些使用者可見的影響。首先,代碼是更容易維護,更易于使用(添加subheaders相當多的工作),并略小于偶爾無法讀取。這是什麼讓我們輕松實作variadic進駐,應該更容易在将來壁球bug。第二,很難走進調試器的情況(抱歉!)。第三,(piecewise_construct_t,元組 < … …args1 > < args2… …>的元組)對構造函數“有趣”的效果。這就要求n ^2重載(如果我們支援多達10元組,這意味着121重載,因為空元組計數在這裡太大)。最初,我們發現這(濫發出這麼多對元組重載,再加上所有的重載,這些重載進駐)消耗了大量的記憶體。在編譯期間,作為一種解決方法,我們減少了無窮。在vc9 sp1和頁本頁,無限是10(即“variadic”模闆支援具有包容性的0到10節參數)。在vc12的開發者預覽中,無限是預設情況下的5。這得回頁本頁是什麼我們編譯器記憶體消耗。如果需要更多的參數(例如有代碼編譯vc9 sp1或頁本頁使用6元組),可以定義_variadic_max 5至10包容性(預設為5)項目範圍。增加它将使編譯器會消耗更多的記憶體。

随機性:uniform_int_distribution現在是完全不帶偏見,和我們已經實作了shuffle(), ,它直接接受像mersenne_twister的均勻随機數發生器。

抗運算符重載的位址:c++98/03禁止其位址的運算符重載的stl容器元素。這是像ccomptr類做些什麼,是以像cadapt的幫助器類都必須屏蔽stl從這種重載。頁本頁的發展過程中,所做的stl的更改同時大規模重寫(對于rvalue引用,除其他外),stl重載位址的運算符在某些情況下甚至更多。

然而c++12改變其需求,使運算符重載的位址可以接受(c++11和頁本頁,提供幫助器函數std::addressof(),這是能夠獲得真實位址的運算符重載對象)。頁本頁發送之前,我們試圖稽核所有stl容器中的事件“和元素”,代之以“std::addressof(elem)”這是适當的抗性。在vc12,我們已經進一步發展。現在我們已經審計所有容器和所有的疊代器,是以重載其位址的運算符的類應該是整個stl可用。任何剩餘的問題都應通過microsoft連接配接向我們報告的錯誤。(可以想象,grepping為“及元素”相當難!)還沒稽核算法,但偶然一瞥向我表示他們并不特别喜歡的元素的位址。還将超越c++12的幾種方式:

令人容易失誤的疊代器:但不是允許所需的c++11标準,已實施避免易失誤的疊代器,所形容的“最小化依賴項内泛型類的快和小程式‘n2911和n2980’易失誤的疊代器配置設定和初始化,修訂1”。

檔案系統:已經添加頭tr2的建議,如recursive_directory_iterator。來自boost.filesystem v2。它後來演變成boost.filesystem v3,但這都不會實作的vc12。

最後,在衆多的錯誤修正,我們開展了主要的優化!所有我們的容器(一般說來)現最佳小給予其目前的表示形式。這指容器對象本身,不其指向膽量。例如,矢量包含三個原始指針。頁本頁,向量x 86釋出模式,是16個位元組。在vc12,它是12個位元組,這是最佳小。如果在程式中有100,000的載體 —vc12将為節省400kb,這是一個大問題。降低的記憶體使用節省了時間和空間。

這裡是所有x86和x 64的大小。(32位arm是相當于x 86為這些目的)。當然,這些表包括釋出模式下,調試模式包含所消耗的時間和空間的機械檢查。在vc9 sp1中,_secure_scl預設為1,而對于vc9 sp1中的_secure_scl手動設定為0,最大速度為單獨的列。預設為0(現名為_iterator_debug_level的_secure_scl本頁和vc12)。

繼續閱讀