1. 程式人生 > >C++——VisualStudio的c++11特性(一)

C++——VisualStudio的c++11特性(一)

前言

檢視官網https://msdn.microsoft.com/library/

從VisualStudio2010講起,主要是針對c++11特性來研究vs開發c++的IDE的強大之處

VisualStudio2010下載release(釋出版本)地址:https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2010-version-history

由上文https://blog.csdn.net/u012198575/article/details/83112915《C++——發展歷史》可知

新的c++標準(c++11)是2011年年中釋出的

而VisualStudio2010是2010年4月12日釋出的是用原先的c++0x特性,這裡不做過多介紹

    繼VisualStudio2010後的版本VisualStudio2012

檢視官網介紹https://msdn.microsoft.com/zh-cn/library/hh567368(v=vs.110).aspx

說明了:Visual C++ 2010 實現了 C++0x 核心語言規範的許多功能,是前體 C++11,並且,Visual Studio 2012 中的 Visual C++ 在該擴充套件包含許多 C++11 功能。 下表列出了 C++11 核心語言功能及其實現的狀態。Visual C++ 2010 和 Visual Studio 2012 中的 Visual C++。

區別:

1、Rvalue 引用

N1610“選件類物件的初始化宣告由 rvalues” 是一個早期嘗試啟用移動語義不 rvalue 引用。 在本討論中,我們稱之為“rvalue 引用 v0.1”。它由“取代 rvalue 引用 v1.0”。“Rvalue 引用 v2.0”,正是在 Visual C++ 2010 的工作開始,禁止 rvalue 從繫結到 lvalue 從而解決主安全問題引用。“ Rvalue 引用 v2.1“優化此規則。 考慮 vector<string>::push_back(),具有超負載push_back(const string&) 和 push_back(string&&)和呼叫 v.push_back("strval")。 該表示式 "strval" 是字串寫入,因此,它是 lvalue。 (其他文字,如將整數 1729,這是 rvalues,但是,字串寫入是特定的,因為它們是陣列。)rvalue 引用 v2.0 規則顯示,string&& 不能繫結到 "strval",因為 "strval" 是 lvalue,因此,push_back(const string&) 是唯一的可行超負載。 這將建立臨時 std::string,將其複製到向量,然後銷燬臨時 std::string。 這不是非常高效。 rvalue 引用 v2.1 規則識別該繫結 string&& 到"strval" 將建立臨時 std::string,因此,該臨時是 rvalue。 因此,push_back(const string&) 和 push_back(string&&) 可行的,因此,push_back(string&&) 首選方法。 臨時 std::string 構造,然後將該向量。 這是更有效。

在特定條件下“Rvalue 引用 上述”新增新規則集自動生成移動建構函式和移動賦值運算子。 但是,這在 Visual Studio 2012 中的 Visual C++未實現,因為時間和資源約束。

2、Lambdas
在 lambda 函式 輪詢到工作檔案 (版本 0.9) 之後,並且變數的 lambda 已新增 (版本 1.0),標準化可將實質上已字詞。 這將產生了 lambda 版本 1.1。 這在 Visual C++ 2010太后發生合併,但是,它在 Visual Studio 2012 中的 Visual C++。 lambda 的字詞闡明瞭在角用例應發生希望引用靜態成員或巢狀 lambda。 此修復由複雜 lambda 觸發的 bug。 此外,在 Visual Studio 2012 中的 Visual C++無狀態的 lambda 轉換為函式指標。 這不在 N2927 字詞,但是,它無論 + 如何計數為 lambda 的一部分。 FDIS 5.1.2 [expr.prim.lambda]/6 具有此宣告:,當關閉型別的函式呼叫運算子,“的 lambda 表示式的型別不關閉 lambda 捕獲有一個公共非虛擬非顯式常量轉換函式指標傳遞給具有的功能相同引數和返回型別。 此轉換函式返回的值是函式的地址,那麼,當呼叫,其效果和呼叫關閉型別相同的函式呼叫運算子”。( Visual Studio 2012 中的 Visual C++ 相比,好,因為我們使無狀態的 lambda 轉換函式具有任意呼叫約定的指標。 這是重要的,在使用需要與 __stdcall 函式指標的內容。) 的 API 時

3、decltype

在 decltype 輪詢到工作檔案 (版本 1.0) 後,它最後一刻接收小,但重要的 bug 修復 (版本 1.1)。 這是了感興趣在 STL 和引發工作的程式設計師。

4、強型別/向前宣告列舉

強型別的列舉 在 Visual C++ 2010 (特別是,有關顯式指定的基礎型別的部分部分支援)。 Visual Studio 2012 中的 Visual C++ 完全實現,他們完全實現 C++11 語義 前向宣告列舉

5、對齊方式

Visual C++ 2010 和 Visual Studio 2012 中的 Visual C++ 實現核心語言關鍵字 alignas/從輪詢到工作檔案的 對齊建議alignof。Visual C++ 2010 具有從 TR1 的 aligned_storage。 Visual Studio 2012 中的 Visual C++ 新增 aligned_union 和 std::align()到標準庫。

6、標準格式和常用的型別

顯示的更改從 N2342“重新訪問的 POD 的;解決的問題 568 核心 (版本 5)” 是 is_trivial 和 is_standard_layout 的向<type_traits>。 (N2342 修改了大量核心語言,字詞,但編譯器沒有必需的更改。)這些型別特徵可在 Visual C++ 2010,但是,它們複製 is_pod。 因此,表之前文件中顯示“不支援”。 在 Visual Studio 2012 中的 Visual C++,它們被設計為精確的答案編譯器掛鉤關閉。

7、重寫和最終

這通過短,但複雜的發展。 最初, 版本 0.8,[[override]], [[hiding]] 以及 [[base_check]] 特性。 然後,版本 0.9屬性使用上下文關鍵字消除並替換。 最後,版本 1.0它們減少到“final”在選件類和“override”和“final在函式。 這使它成為個 ascending 的擴充套件,因為 Visual C++ 2010 已經支援函式中的此“override”語法,並具有語義合理關閉會 C++11。“ final ”還支援,但是,在其他拼寫“下方密封了”。 在 Visual Studio 2012,“override”和“final”標準拼寫和語義完全支援。 有關更多資訊,請參見override 說明符final 說明符

8、Atomics 和更多

Atomics強請比較和交換雙向範圍資料依賴項排序 然後指定標準庫前,在 Visual Studio 2012 中的 Visual C++實現。

9、標準庫函式

該報告核心語言。 有關 C++11 標準庫,我們不具有一個以美觀的表,但是,Visual Studio 2012 中的 Visual C++ 實現該介面,有兩個異常。 首先,那麼,當庫功能取決於缺少在編譯器的功能時,我們可模擬它要求 (例如,我們模擬 make_shared<T>()的 variadic 模板 (或我們不實現該介面存在,特別是,只在少數情況下 <initializer_list>。 接下來,C99 標準庫,將對 C++11 標準庫,主要未實現,不過,<stdint.h> 在 Visual C++ 2010實現的。 這是部分列出了 Visual Studio 2012 中的 Visual C++中的更改:

新標頭: <atomic><chrono><condition_variable><future><mutex><ratio><scoped_allocator><thread>

根據 C++11,emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() 的建立: 在“引數的任意”數字 (請參見“虛假 variadics”部分) 的任何容器實現。 例如,vector<T> 具有“直接構造元素型別 T 在向量的返回從任意數量的任意引數的,完全轉發的template <typename... Args> void emplace_back(Args&&... args)。 這比 push_back(T&&)可以高效,將包括額外的移動構造和析構。

虛假 variadics:Visual Studio 2012 中的 Visual C++ 具有模擬的 variadic 模板新架構。 在 Visual C++ 2008 SP1 和 Visual C++ 2010,subheaders 重複包括了不同的每次生成定義的巨集,滅絕 0,1,2,3,或多個引數的超負載。 例如,<memory> 重複包含內部 subheader <xxshared>,滅絕 make_shared<T>(args, args, args)。 在 Visual Studio 2012 中的 Visual C++,subheaders 轉到。 現在 variadic 模板定義為巨集 (與許多槓繼續) 通過母版巨集,然後展開。 此內部實現更改具有這些效果:

  • 程式碼更易於維護,更易於使用 (新增 subheaders 適合數量的工作),和可讀性。

  • 單步執行與偵錯程式抱歉更難!

  • std::pair pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) 建構函式具有“有趣的”效果。 這需要 N^2 超載入 (如果我們支援到 10 元組,該太意味著 121 超負載,因為空元組計數此處,)。

傳送相同的訊息到多個按組許多對元組超負載,和任何建立超負載,在編譯時已佔用大量記憶體。 因此,我們減少了無窮大。 在 Visual C++ 2008 SP1 和 Visual C++ 2010,不是 10 (即“variadic”模板支援 0 到 10 個引數,包含)。 預設情況下,不是 5 在 Visual Studio 2012 中的 Visual C++。 這使編譯器記憶體消耗回什麼是在 Visual C++ 2010。 如果需要更多引數 (例如,因此,如果您具有使用 6 元組) 的現有程式碼,所以緊急匯出。 可以定義 _VARIADIC_MAX 專案在 5 和 10 之間包含。 將佔用太多記憶體,並可能需要使用 /Zm 編譯器選項保留多個空格預先生成標頭的。

隨機性: uniform_int_distribution 現已完成公平的,因此,shuffle() 在 <algorithm>實現,直接接受與 mersenne_twister的統一隨機數生成器。

對過載的抵抗 address-of 運算子: C++98/03 禁止 STL 容器的元素過載其地址運算子。 這就是"類別。CComPtr 執行,因此,需要與 CAdapt 的幫助器類選件防止這種超載入的 STL。 在 Visual C++ 2010的開發過程中,STL 更改使其拒絕過載地址更情況的運算子。 C++11 更改了要求使過載 address-of 運算子可接受。 C++11 和 Visual C++ 2010,提供幫助器函式 std::addressof(),而不管運算子過載,可以獲取物件真實地址。 在釋出之前 Visual C++ 2010,我們將嘗試用“std::addressof(elem)”替換“&elem”顯示時,正確有吸引力。 在 Visual Studio 2012 中的 Visual C++,我們進一步轉到。 現在我們稽核的所有容器和所有迭代器,因此,這些過載運算子地址的選件類應可在 STL 中。

Visual Studio 2012 中的 Visual C++ 超過 C++11 範圍的方法有多種:

可怕迭代器: 如允許使用,但不要求由標準的 C++11,可怕迭代器實現,如中所述 “將泛型選件類中的依賴項 N2911 更快、更小程式的” 和 N2980“可怕迭代分配和初始化,版本 1 "

檔案系統: <filesystem> 標頭從 TR2 建議 已新增。 它提供 recursive_directory_iterator 和其他有趣的功能。 在 TR2 的工作凍結之前,因為 C++0x 非常後執行並更改為 C++11,該 2006 年建議從 + 中派生的 Boost.Filesystem V2。 它後面轉變為 Boost.Filesystem V3,但這在 Visual Studio 2012 中的 Visual C++未實現。

和一個母版優化! 我們的容器現在最好較小的給定的所有其當前表示。 這表示為其容器物件,而不指向內容。 例如,std::vector 包含三個基元的指標。 在 Visual C++ 2010,x86 版本的模式,std::vector 為 16 位元組。 在 Visual Studio 2012 中的 Visual C++,它是 12 個位元組,最好較小的。 這很大,事務如果您有 100,000 個向量在您的程式,Visual Studio 2012 中的 Visual C++ 將為您節省 400,000 位元組。 減少記憶體使用量節省空間和時間。

這是通過避免 null 的分配器和比較儲存實現,因為 std::allocator 和 std::less 是無狀態的。 (這些優化為自定義分配器/比較器啟用,前提是無狀態的。 顯然,監視狀態的分配器/比較器儲存不能避免,但是,某些非常少見。)

10、容器大小

下表列出了位元組顯示容器的邊界,x86 和 x64 平臺的。 (32 位 ARM 與這些目的 x86 等效)。 這些桌帷釋出模式,因為除錯模式包含檢查佔用空間和時間的很多。 不同的列是 Visual C++ 2008 SP1,_SECURE_SCL 預設為 1,並且,對於 Visual C++ 2008 SP1 和_SECURE_SCL 手動設定為 0 最大速度。 Visual C++ 2010 和 Visual Studio 2012 中的 Visual C++ 預設 _SECURE_SCL 到 0 (現在稱為 _ITERATOR_DEBUG_LEVEL)。

 

以上區別,我會後續更新每個含義和domo演示,敬請期待。