`
tubaluer
  • 浏览: 1440317 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

Visual Studio 11开发指南(13)C++11语言新特性

 
阅读更多

有一种新的 c + + 标准和新版本的 Visual c + +,新的版本Visual C++将更加符合C++标准!

在其发展过程中新的 c + + 标准被 (乐观) 称为 C + + 0x。它最后被发布在 2011 年,和现在称为 C + + 11。

对于 Visual c + +,它有三个不同版本的数字, 有不同的内部版本和编译器版本 (cl.exe 和_MSC_VER宏-显示这是不同因为我们 c + + 编译器早在 Visual c + + 中的"可视化")。例如:

VS 2005 == VC8 == _MSC_VER 1400
VS 2008 == VC9 == _MSC_VER 1500
VS 2010 == VC10 == _MSC_VER 1600

在内部,就只是 VC11。

如果你读了C++0X标准,以及熟悉VC的诸个版本的不同,就会理解。

C++11 Core Language Features VC10 VC11
Rvalue references v0.1, v1.0, v2.0, v2.1, v3.0 v2.0 v2.1*
ref-qualifiers No No
Non-static data member initializers No No
Variadic templates v0.9, v1.0 No No
Initializer lists No No
static_assert Yes Yes
auto v0.9, v1.0 v1.0 v1.0
Trailing return types Yes Yes
Lambdas v0.9, v1.0, v1.1 v1.0 v1.1
decltype v1.0, v1.1 v1.0 v1.1**
Right angle brackets Yes Yes
Default template arguments for function templates No No
Expression SFINAE No No
Alias templates No No
Extern templates Yes Yes
nullptr Yes Yes
Strongly typed enums Partial Yes
Forward declared enums No Yes
Attributes No No
constexpr No No
Alignment TR1 Partial
Delegating constructors No No
Inheriting constructors No No
Explicit conversion operators No No
char16_t and char32_t No No
Unicode string literals No No
Raw string literals No No
Universal character names in literals No No
User-defined literals No No
Standard-layout and trivial types No Yes
Defaulted and deleted functions No No
Extended friend declarations Yes Yes
Extended sizeof No No
Inline namespaces No No
Unrestricted unions No No
Local and unnamed types as template arguments Yes Yes
Range-based for-loop No No
override and final v0.8, v0.9, v1.0 Partial Partial
Minimal GC support Yes Yes
noexcept No No

C++11 Core Language Features: Concurrency VC10 VC11
Reworded sequence points N/A N/A
Atomics No Yes
Strong compare and exchange No Yes
Bidirectional fences No Yes
Memory model N/A N/A
Data-dependency ordering No Yes
Data-dependency ordering: function annotation No No
exception_ptr Yes Yes
quick_exit and at_quick_exit No No
Atomics in signal handlers No No
Thread-local storage Partial Partial
Magic statics No No

C++11 Core Language Features: C99 VC10 VC11
__func__ Partial Partial
C99 preprocessor Partial Partial
long long Yes Yes
Extended integer types N/A N/A

这里是快速指南,希望大家有一定的C++基础,熟悉啥是 c + + 11:

Rvalue 引用:N1610"Rvalues 类对象的初始化的澄清"是早期尝试启用无 rvalue 引用 move 语意。我称它"rvalue 引用 v0.1",因为它的历史感兴趣的只是。它被取代 rvalue 引用v1.0,措辞。Rvalue 引用2.0 版,这是我们所附带的页本页 RTM/SP1,禁止 rvalue 引用绑定到左值,解决重大的安全问题。Rvalue 引用v2.1精炼此规则。考虑矢量 <string>:: push_back(),有的重载,这些重载push_back(const string&)和push_back(string&&),并调用v.push_back("meow")。字符串文字,表达"喵 — —",它是一个 lvalue。(1729年像所有其他文字是 rvalues,但字符串比较特殊,因为它们的数组)。Rvalue 引用 v2.0 规则,看看这个,说,字符串 & &无法绑定到"喵",因为"喵 — —"是一个 lvalue,所以push_back(const string&)是唯一可行的重载。这将创建临时的std::string,将其复制到向量,然后销毁临时的std::string。恶 ! !Rvalue 引用 v2.1 规则承认该绑定字符串 & & "喵"将创建临时的std::string,和该临时是 rvalue。因此,两个push_back(const string&)和push_back(string&&)是可行的和push_back(string&&)是首选。构造的临时的std::string则将其移入的矢量。这是效率更高,这是好 !(的我忽略小字符串优化这里。)

因为这些新规则还没有完全实现 VC11 开发者预览中,表说:"v2.1*"。这是正在跟踪的活动的 bug。(事实上,这就是标准的修正错误)。

Rvalue 引用v3.0添加自动生成的构造函数和移动赋值运算符在一定条件下的新规则。这不会进行中 VC11,还将继续遵循的永远不会自动生成 move 构造函数/移动页本页的行为。(跟所有的这里的尚未实现的功能,这是由于时间和资源的约束,并不因功能本身不喜欢 !)

(顺便,所有此 v0.1、 v1.0、 v2.0、 v2.1,3.0 版的东西是我自己的术语中,我认为将明确添加到 C + + 11 的演变。)

Lambda:Lambda 被选入工作文件 (v0.9) 和可变 lambda 添加 (v1.0) 后,标准化委员会彻底改革措辞,生产 lambda 1.1 版。这太晚发生才能实现页本页,但我们已经实现了它 VC11。Lambda v1.1 措辞澄清在像引用静态成员或嵌套的 lambda 角情况下该怎么办。这可以修复 bug 引发复杂的 lambda 的一群。此外,无国籍的 lambda 现已转换为 VC11 中的函数指针。这不是在 N2927 的措辞,但不管怎样,我数它作为 lambda v1.1 的一部分。这是跨国公司直接投资 5.1.2 [expr.prim.lambda]/6:"没有lambda 捕获 lambda 表达式的封闭类型有公共非虚拟非明确const转换函数具有相同的参数和返回类型,如封闭类型的函数调用操作符的函数指针。此转换函数返回的值应函数的地址调用时,已调用该封闭类型的函数调用操作符相同的效果。"(它是更重要的是,因为我们已经作出无国籍的 lambda 可转换的任意调用约定的函数指针。这是重要期望__stdcall函数指针,等等的 Api 打交道时。

decltype:Decltype被选入工作文件 (v1.0) 后,在最后一刻 (v1.1) 收到小但很重要的修正错误。这并不是有趣的大多数程序员,但这是极大的兴趣,程序员来说 STL 和提高工作。表说"v1.1* *"因为这并不在 VC11 的开发者预览中,实施,但实施它所做的更改已签入。

强烈键入/转发声明枚举:强类型的枚举了部分支持页本页 (具体而言,有关显式指定基础类型的部分),和 C + + 11 的语义向前声明枚举不在所有支持页本页。都已经在 VC11 中完全执行。

对齐方式:页本页既 VC11 执行核心语言关键字alignas/alignof从对齐方式提案的最终表决通过工作文件。页本页已从 TR1 aligned_storage。VC11 标准库添加 aligned_union 和std::align() 。

标准布局和琐碎的类型:至于我可以说,从N2342 "POD 的重新 ; 用户可见的变化解决核心问题 568 (修订 5)"是添加了is_trivial和is_standard_layout到<type_traits>。(N2342 执行很多手术核心语言的措辞,但它只是让东西明确用户可能没有受到不管怎样,因此不需要进行任何编译器更改)。我们将这些类型的特征在页本页,但他们只是重复 is_pod,所以我打电话说"不"支持。在 VC11,他们被动力由编译器挂钩,它们应给出准确的答案。

扩展的朋友声明:去年,我说页本页部分支持这。经仔细检查N1791后, 我已确定的 VC 的支持,这是基本上完成 (它甚至不发出警告"非标准扩展",与一些其他登上扩展此表中不同)。所以我已经标记页本页和 VC11 都为"是"。

重写和决赛:经历了短暂而复杂的演变。最初 (v0.8) 有 [[覆盖]],[[隐藏]],和 [[base_check]] 属性。然后 (v0.9) 属性被淘汰,并替换为上下文关键字。最后 (v1.0),他们沦落到"最后"类和"重写"和"最后"功能上。这使得它登上的扩展,如 VC 已经支持此"重写"语法功能,具有语义合理地靠近 C + + 11 的。"最后"也是支持的但根据不同的拼写"密封"。这符合我的表中的"局部"支持。

最小的 GC 支持:事实证明, N2670只用户可见的变化不是操作标准库函数,我们已经在页本页中捡了一堆。

序列点的措辞:后盯着N2239的变化,取代 C + + 98/03 的"序列点"措辞与 C + + 11 的"序前"措辞 (这是更有用的而且更友好多线程处理),似乎是编译器或标准库实现做什么。所以我已经标记这为不适用。

原子,等:原子强比较和交换双向围栏,和数据依赖顺序指定标准库机械,而我们正在实施的 VC11。

内存模型:N2429提出核心语言识别存在的多线程处理,但似乎什么也不做编译器执行 (至少一已经支持多线程)。所以在表中不适用。

扩展的整数类型:N1988本身说:"实施成本上的最后一点: 这个扩展在大多数编译器可能会导致没有变化。任何编译器,已没有整数类型除外规定的标准 (和一些版本的长长,其任务是通过 N1811 变化) 将可能已经符合。"另一项不适用功能 !

这包括核心语言。至于标准库中,我没有这样的功能,漂亮表,但我有好消息:

在 VC11,我们打算完全支持 C + + 11 标准库,但实施编译器功能可以自定义。(另外,VC11 不会完全实现 C99 标准库,已经通过引用纳入 C + + 11 标准库。注意页本页和 VC11 已经有<stdint.h>)。这里是我们不断的变化的非详尽列表:

新头文件:<atomic>、 <chrono>、 <condition_variable>、 <future>、 <mutex>、 <ratio>、 <scoped_allocator>和<thread>。(和我已经在页本页中删除破碎的<initializer_list>标头,我无意离开)

进驻:根据需要由 C + + 11,我们已经实现了emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after()在所有容器的"任意"数字的参数 (见下文)。例如,矢量 <T>有"模板 < typename … …Args > 无效 emplace_back (Args & & … … args)"的直接构造任意数量的任意参数,完美转发从向量的背部 T 类型的元素。这可以更有效地比push_back(T&&),会涉及额外移动建设和破坏。(页本页支持从 1 的参数,并不是特别有用的侵位)。

人造 variadics:我们开发了一种新的模拟 variadic 模板方案。以前在 VC9 SP1 和页本页,我们一再包括 subheaders 在定义不同的每一次,为了杜绝为 0、 1、 2、 3,等参数的重载的宏。(例如,<memory> 包含内部 subheader <xxshared>反复,为了杜绝make_shared <T> (args,args,args)。)在 VC11,subheaders 已经过去了。现在我们 variadic 模板本身定义为宏 (带有大量的反斜杠延续),然后将其展开主宏。此内部实现更改具有某些用户可见的影响。首先,代码是更容易维护,更易于使用 (添加 subheaders 相当多的工作),并略小于偶尔无法读取。这是什么让我们轻松实现 variadic 进驻,应该更容易在将来壁球 bug。第二,很难走进调试器的情况 (抱歉 !)。第三,对的 (piecewise_construct_t,元组 < … … Args1 > > < Args2 … … 的元组) 对构造函数有"有趣"的效果。这就要求 N ^2 重载 (如果我们支持多达 10 元,这意味着 121 重载,因为空元组计数在这里太)。最初,我们发现这 (滥发出这么多对元组重载,再加上所有的重载,这些重载进驻) 消耗了大量的内存在编译期间,所以作为一种解决方法,我们减少了无穷。在 VC9 SP1 和页本页,无限是 10 (即"variadic"模板支持具有包容性的 0 到 10 参数)。在 VC11 的开发者预览中,无限是默认情况下的 5。这得回页本页是什么我们编译器内存消耗。如果您需要更多的参数 (例如你有代码编译 VC9 SP1 或页本页使用 6 元),有一个推卸。您可以定义_VARIADIC_MAX 5 至 10 包容性 (默认为 5) 项目范围。增加它将使编译器会消耗更多的内存,并可能要求您使用/Zm选项为私营护理安老院保留更多的空间。

随机性:uniform_int_distribution现在是完全不带偏见,和我们已经实现了shuffle() , <algorithm>,它直接接受像mersenne_twister的均匀随机数发生器.

抗运算符重载的地址:C + + 98/03 禁止其地址的运算符重载的 STL 容器元素。这是像CComPtr类做些什么,所以像CAdapt的帮助器类都必须屏蔽 STL 从这种重载。页本页的发展过程中,我们所做的 STL 仇恨的更改同时大规模重写 (对于 rvalue 引用,除其他外),STL 重载地址的运算符在某些情况下甚至更多。(您可能记得我 VCBlog 之一对此职位。)然后 C + + 11 改变其需求,使运算符重载的地址可以接受。(C + + 11 和页本页,提供帮助器函数std::addressof(),这是能够获得真实地址的运算符重载无论对象。)页本页发货之前,我们试图审核所有 STL 容器中的事件"和元素",代之以"std::addressof(elem)"这是适当的抗性。在 VC11,我们已经进一步发展。现在我们已经审计所有容器和所有的迭代器,所以重载其地址的运算符的类应该是整个 STL 可用。任何剩余的问题都应通过 Microsoft 连接向我们报告的错误。(可以想象,grepping 为"及元素"是相当难 !)还没审核算法,但偶然一瞥向我表示他们并不特别喜欢的元素的地址。

我们还将超越 C + + 11 的几种方式:

令人容易失误的迭代器:但不是允许所需的 C + + 11 标准,已实施可怕的迭代器,所形容的"最小化依赖项内泛型类的快和小程序" N2911N2980 "可怕的迭代器分配和初始化,修订 1"。

文件系统:我们已经添加<filesystem>头TR2 的建议,从展出过冷处理的机械,如 recursive_directory_iterator。请注意,2006年建议 (TR2 工作被冻死了由于 C 之前 + + 0x 运行非常晚和转弯到 C + + 11) 来自 Boost.Filesystem V2。它后来演变成Boost.Filesystem V3,但这都不会实现的 VC11。

最后,在众多的错误修正,我们开展了主要的优化 !所有我们的容器 (一般说来) 现最佳小给予其当前的表示形式。这指容器对象本身,不其指向胆量。例如,矢量包含三个原始指针。页本页,向量 x 86 发布模式,是 16 个字节。在 VC11,它是 12 个字节,这是最佳小。如果您在程序中有 100,000 的载体 — — VC11 将为您节省 400000 个字节,这是一个大问题。降低的内存使用节省了时间和空间。

这被通过避免存储空分配器和比较器。(我们会激活这些优化的自定义分配器/比较器太,只要他们是无类型强定义。很明显,我们不能避免存储状态分配器/比较器,但那些罕见。)

这里是所有 x86 和 x 64 的大小。(32 位 ARM 是相当于 x 86 为这些目的)。当然,这些表包括发布模式下,调试模式包含所消耗的时间和空间的检查机械。我有 VC9 SP1 中, _SECURE_SCL默认为 1,而对于 VC9 SP1 中的_SECURE_SCL手动设置为 0,最大速度为单独的列。默认为 0 (现名为_ITERATOR_DEBUG_LEVEL的_SECURE_SCL页本页和 VC11).

x86 Container Sizes (Bytes) VC9 SP1 VC9 SP1
SCL=0
VC10 VC11
vector<int> 24 16 16 12
array<int, 5> 20 20 20 20
deque<int> 32 32 24 20
forward_list<int> N/A N/A 8 4
list<int> 28 12 12 8
priority_queue<int> 28 20 20 16
queue<int> 32 32 24 20
stack<int> 32 32 24 20
pair<int, int> 8 8 8 8
tuple<int, int, int> 16 16 16 12
map<int, int> 32 12 16 8
multimap<int, int> 32 12 16 8
set<int> 32 12 16 8
multiset<int> 32 12 16 8
hash_map<int, int> 72 44 44 32
hash_multimap<int, int> 72 44 44 32
hash_set<int> 72 44 44 32
hash_multiset<int> 72 44 44 32
unordered_map<int, int> 72 44 44 32
unordered_multimap<int, int> 72 44 44 32
unordered_set<int> 72 44 44 32
unordered_multiset<int> 72 44 44 32
string 28 28 28 24
wstring 28 28 28 24

x64 Container Sizes (Bytes) VC9 SP1 VC9 SP1
SCL=0
VC10 VC11
vector<int> 48 32 32 24
array<int, 5> 20 20 20 20
deque<int> 64 64 48 40
forward_list<int> N/A N/A 16 8
list<int> 56 24 24 16
priority_queue<int> 56 40 40 32
queue<int> 64 64 48 40
stack<int> 64 64 48 40
pair<int, int> 8 8 8 8
tuple<int, int, int> 16 16 16 12
map<int, int> 64 24 32 16
multimap<int, int> 64 24 32 16
set<int> 64 24 32 16
multiset<int> 64 24 32 16
hash_map<int, int> 144 88 88 64
hash_multimap<int, int> 144 88 88 64
hash_set<int> 144 88 88 64
hash_multiset<int> 144 88 88 64
unordered_map<int, int> 144 88 88 64
unordered_multimap<int, int> 144 88 88 64
unordered_set<int> 144 88 88 64
unordered_multiset<int> 144 88 88 64
string 40 40 40 32
wstring 40 40 40 32

分享到:
评论

相关推荐

    Visual Studio 2008 开发指南

    Visual Studio 2008开发指南,英文版资料,目前还没有中文版哦!不过值得观看哦!(分成了两部压缩卷哦!此卷为第二部分哦!)

    Visual C++2012 开发权威指南

    主要内容:Metro新特性、Visual Studio 2012九大新功能,Visual C++ 2012语言新特性,Visual C++ 2012的异步编程与网络编程,实现并行编程充分利用多核处理能力,基于Visual C++充分使用GPU的计算能力,使用Lambda、...

    Visual C++图形用户界面开发指南

    Visual C++图形用户界面开发指南 Visual C++图形用户界面开发指南 vc电子教程下载

    Visual C++2010开发权威指南(共三部分).part1.rar

    第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境...

    Visual_studio_2012_C++_指导教程.pdf

    Visual_studio_2012_C++_指导教程

    Visual Studio2008开发指南

    Visual Studio 2008开发指南,英文版资料,目前还没有中文版哦!不过值得观看哦!(分成了两部压缩卷哦!此卷为第一部分哦!)

    Microsoft Visual C++ 6.0程序员指南

    本书是美国微软出版社授权的Microsoft Visual Studio系列中文版图书之一,它是Visual C++ 6.0程序员的实用参考书。 全书共分成六个部分: 第一部分介绍Developer Studio和AppWizard的基础知识; 第二部分介绍文本、...

    Visual C++2010开发权威指南

    Visual C++2010开发权威指南 VisualStudio_2010_使用指南

    Visual_c++程序员指南

    本书是美国微软出版社授权的Microsoft Visual Studio系列中文版图书之一,它是Visual C++ 6.0程序员的实用参考书。全书共分成六个部分:第一部分介绍Developer Studio和AppWizard的基础知识;第二部分介绍文本、图形...

    Visual C++2010开发权威指南.part01

    第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与 1.3 新特性 3 1.4 Visual C++ 2010开发...

    《Visual C++ 6.0 程序员指南》完美带书签中文版

    本书是美国微软出版社授权的 Microsoft Visual Studio系列中文版图书之一,它是 Visual C++ 6.0程序员的实用参考书。 书中讨论的许多主题均以范例程序进行说明,所有范例程序的项目文件都在配套光盘上。本书是从事...

    \Visual C++网络通信程序开发指南

    \Visual C++网络通信程序开发指南\Visual C++网络通信程序开发指南

    Visual studio C++ DLL的生成和使用指南

    VC中DLL的生成中文介绍,很好的一个关于DLL的生成的介绍

    visual c++ 程序员指南

    第三部分是编程指南,展示了如何使用Classwizard和 Gallery来加速编程开发工作,创建自己的组件; 第四部分介绍 ActiveX控件及其使用,说明如何用MFC或ATL来写 ActiveX控件; 第五部分讨论调试器的各种能力,程序...

    《Visual C++ 2010 开发权威指南》 光盘源码

    我买的正版书,光盘里附的源代码。 编译环境:Visual Studio 2010

    Visual C++2010开发权威指南.part03

    第二部分 Visual C++ 2010下MFC开发 第6章 计算机测控系统概述 267 6.1 Visual C++ 2010 SDI开发简介 267 6.1.1 建立应用程序基本框架 267 6.1.2 处理视图 267 6.1.3 处理文档 271 6.1.4 串行化处理 274 6.1.5 SDI...

    Visual C++ 6 .0 多媒体开发指南.pdf

    Ⅳ Visual C+ + 6 .0 多媒体开发指南 8 .2 .3 DDCAPS 结构..................... 179 8 .2 .4 DDCOLORKEY 结构.................. 180 8 .2 .5 DDOVERLAYFX 结构................. 180 8 .2 .6 DDPIXELFORMAT 结构.....

    Visual C++ 2012入门经典(第6版)

    ◆ 介绍C++语言的当前版本(C++11),以及在Microsoft VisualStudio 2012中实现 ◆ 全面介绍如何使用完整的Visual C++编程语言 ◆ 解释C++标准模板库,以及如何应用它简化编程任务 ◆ 展示在C++中使用Microsoft ...

    使用Visual Studio Team Foundation Server进行团队开发

    本书共分四部分,此为第一部分 包括基础知识、源代码管理、生成、大型项目考虑事项 项目管理、过程指南、报告、设置和维护团队环境和 Visual Studio 2008 Team Foundation Server等九章节 &lt;br&gt;Jeff ...

Global site tag (gtag.js) - Google Analytics