Visual Studio 11开发指南(13)C++11语言新特性
最后更新于:2022-04-01 10:27:18
有一种新的 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](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2869.html)** | **VC10** | **VC11** |
|-----|-----|-----|
| Rvalue references [v0.1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html), [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html), [v2.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html), [v2.1](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1138), [v3.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html) | v2.0 | v2.1* |
| [ref-qualifiers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm) | No | No |
| [Non-static data member initializers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm) | No | No |
| Variadic templates [v0.9](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf), [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf) | No | No |
| [Initializer lists](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm) | No | No |
| [static_assert](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html) | Yes | Yes |
| auto [v0.9](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf), [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm) | v1.0 | v1.0 |
| [Trailing return types](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm) | Yes | Yes |
| Lambdas [v0.9](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2550.pdf), [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2658.pdf), [v1.1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf) | v1.0 | v1.1 |
| decltype [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf), [v1.1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf) | v1.0 | v1.1** |
| [Right angle brackets](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html) | Yes | Yes |
| [Default template arguments for function templates](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226) | No | No |
| [Expression SFINAE](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html) | No | No |
| [Alias templates](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf) | No | No |
| [Extern templates](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm) | Yes | Yes |
| [nullptr](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf) | Yes | Yes |
| [Strongly typed enums](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf) | Partial | Yes |
| [Forward declared enums](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf) | No | Yes |
| [Attributes](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf) | No | No |
| [constexpr](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf) | No | No |
| [Alignment](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf) | TR1 | Partial |
| [Delegating constructors](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf) | No | No |
| [Inheriting constructors](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2540.htm) | No | No |
| [Explicit conversion operators](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf) | No | No |
| [char16_t and char32_t](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2249.html) | No | No |
| [Unicode string literals](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm) | No | No |
| [Raw string literals](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm) | No | No |
| [Universal character names in literals](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html) | No | No |
| [User-defined literals](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2765.pdf) | No | No |
| [Standard-layout and trivial types](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm) | No | Yes |
| [Defaulted and deleted functions](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm) | No | No |
| [Extended friend declarations](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf) | Yes | Yes |
| [Extended sizeof](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2253.html) | No | No |
| [Inline namespaces](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm) | No | No |
| [Unrestricted unions](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf) | No | No |
| [Local and unnamed types as template arguments](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) | Yes | Yes |
| [Range-based for-loop](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html) | No | No |
| override and final [v0.8](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2928.htm), [v0.9](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm), [v1.0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3272.htm) | Partial | Partial |
| [Minimal GC support](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm) | Yes | Yes |
| [noexcept](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html) | No | No |
| **C++11 Core Language Features: Concurrency** | **VC10** | **VC11** |
|-----|-----|-----|
| [Reworded sequence points](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html) | N/A | N/A |
| [Atomics](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html) | No | Yes |
| [Strong compare and exchange](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2748.html) | No | Yes |
| [Bidirectional fences](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2752.htm) | No | Yes |
| [Memory model](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2429.htm) | N/A | N/A |
| [Data-dependency ordering](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2664.htm) | No | Yes |
| [Data-dependency ordering: function annotation](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2782.htm) | No | No |
| [exception_ptr](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html) | Yes | Yes |
| [quick_exit and at_quick_exit](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2440.htm) | No | No |
| [Atomics in signal handlers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2547.htm) | No | No |
| [Thread-local storage](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm) | Partial | Partial |
| [Magic statics](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm) | No | No |
| **C++11 Core Language Features: C99** | **VC10** | **VC11** |
|-----|-----|-----|
| [__func__](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm) | Partial | Partial |
| [C99 preprocessor](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm) | Partial | Partial |
| [long long](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf) | Yes | Yes |
| [Extended integer types](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1988.pdf) | N/A | N/A |
这里是快速指南,希望大家有一定的C++基础,熟悉啥是 c + + 11:
**Rvalue 引用:**[N1610](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2004%2Fn1610.html)"Rvalues 类对象的初始化的澄清"是早期尝试启用无 rvalue 引用 move 语意。
因为这些新规则还没有完全实现 VC11 开发者预览中,表说:"v2.1*"。这是正在跟踪的活动的 bug。
Rvalue 引用[v3.0](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2010%2Fn3053.html)添加自动生成的构造函数和移动赋值运算符在一定条件下的新规则。这不会进行中 VC11,还将继续遵循的永远不会自动生成 move 构造函数/移动页本页的行为。
**Lambda:**Lambda 被选入工作文件 ([v0.9](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2550.pdf)) 和可变 lambda 添加 ([v1.0](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2658.pdf)) 后,标准化委员会彻底改革措辞,生产 lambda [1.1 版](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2009%2Fn2927.pdf)。这太晚发生才能实现页本页,但我们已经实现了它 VC11。Lambda v1.1 措辞澄清在像引用静态成员或嵌套的 lambda 角情况下该怎么办。这可以修复 bug 引发复杂的 lambda 的一群。此外,无国籍的 lambda 现已转换为 VC11 中的函数指针。这不是在 N2927 的措辞,但不管怎样,我数它作为 lambda v1.1 的一部分。这是跨国公司直接投资 5.1.2 [expr.prim.lambda]/6:"没有*lambda 捕获 lambda 表达式*的封闭类型有公共非虚拟非明确const转换函数具有相同的参数和返回类型,如封闭类型的函数调用操作符的函数指针。此转换函数返回的值应函数的地址调用时,已调用该封闭类型的函数调用操作符相同的效果。"
**对齐方式:**页本页既 VC11 执行核心语言关键字alignas/alignof从[对齐方式](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2341.pdf)提案的最终表决通过工作文件。页本页已从 TR1 aligned_storage。VC11 标准库添加 aligned_union 和std::align() 。
**标准布局和琐碎的类型:**至于可以说,从[N2342](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2342.htm) "POD 的重新 ; 用户可见的变化解决核心问题 568 (修订 5)"是添加了is_trivial和is_standard_layout到<type_traits>。(N2342 执行很多手术核心语言的措辞,但它只是让东西明确用户可能没有受到不管怎样,因此不需要进行任何编译器更改)。我们将这些类型的特征在页本页,但他们只是重复 is_pod,所以我打电话说"不"支持。在 VC11,他们被动力由编译器挂钩,它们应给出准确的答案。
**扩展的友元声明:**是基本上完成 (它甚至不发出警告"非标准扩展",与一些其他登上扩展此表中不同)。所以已经标记页本页和 VC11 都为"是"。
**重写和决赛:**经历了短暂而复杂的演变。最初 ([v0.8](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2009%2Fn2928.htm)) 有 [[覆盖]],[[隐藏]],和 [[base_check]] 属性。然后 ([v0.9](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2010%2Fn3206.htm)) 属性被淘汰,并替换为上下文关键字。最后 ([v1.0](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2011%2Fn3272.htm)),他们沦落到"最后"类和"重写"和"最后"功能上。这使得它登上的扩展,如 VC 已经支持此"重写"语法功能,具有语义合理地靠近 C + + 11 的。"最后"也是支持的但根据不同的拼写"密封"。这符合我的表中的"局部"支持。
**最小的 GC 支持:**事实证明, [N2670](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2670.htm)只用户可见的变化不是操作标准库函数,我们已经在页本页中捡了一堆。
**序列点的措辞:**后盯着[N2239](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2239.html)的变化,取代 C + + 98/03 的"序列点"措辞与 C + + 11 的"序前"措辞 (这是更有用的而且更友好多线程处理),似乎是编译器或标准库实现做什么。所以我已经标记这为不适用。
**原子,等:**[原子](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2427.html)、[强比较和交换](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2748.html)、[双向围栏](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2752.htm),和[数据依赖顺序](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2008%2Fn2664.htm)指定标准库机械。
**内存模型:**[N2429](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2007%2Fn2429.htm)提出核心语言识别存在的多线程处理,但似乎什么也不做编译器执行 (至少一已经支持多线程)。所以在表中不适用。
**扩展的整数类型:**[N1988](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2006%2Fn1988.pdf)本身说:"实施成本上的最后一点: 这个扩展在大多数编译器可能会导致没有变化。任何编译器,已没有整数类型除外规定的标准 (和一些版本的长长,其任务是通过 N1811 变化) 将可能已经符合。"另一项不适用功能 !
这包括核心语言。至于标准库中,我没有这样的功能,漂亮表,但我有好消息:
**在 VC11,我们打算完全支持 C + + 11 标准库**,但实施编译器功能可以自定义。(另外,VC11 不会完全实现 C99 标准库,已经通过引用纳入 C + + 11 标准库。注意页本页和 VC11 已经有<stdint.h>)。这里是我们不断的变化的非详尽列表:
**新头文件:**<atomic>、 <chrono>、 <condition_variable>、 <future>、 <mutex>、 <ratio>、 <scoped_allocator>和<thread>。
**进驻:**根据需要由 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) 项目范围。增加它将使编译器会消耗更多的内存。
**随机性:**uniform_int_distribution现在是完全不带偏见,和我们已经实现了shuffle() , <algorithm>,它直接接受像mersenne_twister的均匀随机数发生器.
**抗运算符重载的地址:**C + + 98/03 禁止其地址的运算符重载的 STL 容器元素。这是像CComPtr类做些什么,所以像CAdapt的帮助器类都必须屏蔽 STL 从这种重载。页本页的发展过程中,所做的 STL 的更改同时大规模重写 (对于 rvalue 引用,除其他外),STL 重载地址的运算符在某些情况下甚至更多。
然后 C + + 11 改变其需求,使运算符重载的地址可以接受。(C + + 11 和页本页,提供帮助器函数std::addressof(),这是能够获得真实地址的运算符重载无论对象。)页本页发送之前,我们试图审核所有 STL 容器中的事件"和元素",代之以"std::addressof(elem)"这是适当的抗性。在 VC11,我们已经进一步发展。现在我们已经审计所有容器和所有的迭代器,所以重载其地址的运算符的类应该是整个 STL 可用。任何剩余的问题都应通过 Microsoft 连接向我们报告的错误。(可以想象,grepping 为"及元素"是相当难 !)还没审核算法,但偶然一瞥向我表示他们并不特别喜欢的元素的地址。
还将超越 C + + 11 的几种方式:
**令人容易失误的迭代器:**但不是允许所需的 C + + 11 标准,已实施避免易失误的迭代器,所形容的"最小化依赖项内泛型类的快和小程序" [N2911](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2FWG21%2Fdocs%2Fpapers%2F2009%2Fn2911.pdf)和[N2980](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2FWG21%2Fdocs%2Fpapers%2F2009%2Fn2980.pdf) "易失误的迭代器分配和初始化,修订 1"。
**文件系统:**已经添加<filesystem>头[TR2 的建议](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2006%2Fn1975.html),如 recursive_directory_iterator。 来自 Boost.Filesystem V2。它后来演变成[Boost.Filesystem V3](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fwww.boost.org%2Fdoc%2Flibs%2Frelease%2Flibs%2Ffilesystem%2Findex.html),但这都不会实现的 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).
<table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="283"/><col width="71"/><col width="64"/></colgroup><tbody><tr height="32"><td align="middle"><strong>x86 Container Sizes (Bytes)</strong></td><td align="middle"><strong>VC9 SP1</strong></td><td align="middle"><strong>VC9 SP1 <br/>SCL=0</strong></td><td align="middle"><strong>VC10</strong></td><td align="middle"><strong>VC11</strong></td></tr><tr height="20"><td align="right">vector<int></td><td align="middle">24</td><td align="middle">16</td><td align="middle">16</td><td align="middle">12</td></tr><tr height="20"><td align="right">array<int, 5></td><td align="middle">20</td><td align="middle">20</td><td align="middle">20</td><td align="middle">20</td></tr><tr height="20"><td align="right">deque<int></td><td align="middle">32</td><td align="middle">32</td><td align="middle">24</td><td align="middle">20</td></tr><tr height="20"><td align="right">forward_list<int></td><td align="middle">N/A</td><td align="middle">N/A</td><td align="middle">8</td><td align="middle">4</td></tr><tr height="20"><td align="right">list<int></td><td align="middle">28</td><td align="middle">12</td><td align="middle">12</td><td align="middle">8</td></tr><tr height="20"><td align="right">priority_queue<int></td><td align="middle">28</td><td align="middle">20</td><td align="middle">20</td><td align="middle">16</td></tr><tr height="20"><td align="right">queue<int></td><td align="middle">32</td><td align="middle">32</td><td align="middle">24</td><td align="middle">20</td></tr><tr height="20"><td align="right">stack<int></td><td align="middle">32</td><td align="middle">32</td><td align="middle">24</td><td align="middle">20</td></tr><tr height="20"><td align="right">pair<int, int></td><td align="middle">8</td><td align="middle">8</td><td align="middle">8</td><td align="middle">8</td></tr><tr height="20"><td align="right">tuple<int, int, int></td><td align="middle">16</td><td align="middle">16</td><td align="middle">16</td><td align="middle">12</td></tr><tr height="20"><td align="right">map<int, int></td><td align="middle">32</td><td align="middle">12</td><td align="middle">16</td><td align="middle">8</td></tr><tr height="20"><td align="right">multimap<int, int></td><td align="middle">32</td><td align="middle">12</td><td align="middle">16</td><td align="middle">8</td></tr><tr height="20"><td align="right">set<int></td><td align="middle">32</td><td align="middle">12</td><td align="middle">16</td><td align="middle">8</td></tr><tr height="20"><td align="right">multiset<int></td><td align="middle">32</td><td align="middle">12</td><td align="middle">16</td><td align="middle">8</td></tr><tr height="20"><td align="right">hash_map<int, int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">hash_multimap<int, int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">hash_set<int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">hash_multiset<int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">unordered_map<int, int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">unordered_multimap<int, int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">unordered_set<int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">unordered_multiset<int></td><td align="middle">72</td><td align="middle">44</td><td align="middle">44</td><td align="middle">32</td></tr><tr height="20"><td align="right">string</td><td align="middle">28</td><td align="middle">28</td><td align="middle">28</td><td align="middle">24</td></tr><tr height="20"><td align="right">wstring</td><td align="middle">28</td><td align="middle">28</td><td align="middle">28</td><td align="middle">24</td></tr></tbody></table>
<table border="0" cellspacing="0" cellpadding="0"><colgroup><col width="283"/><col width="71"/><col width="64"/></colgroup><tbody><tr height="32"><td align="middle"><strong>x64 Container Sizes (Bytes)</strong></td><td align="middle"><strong>VC9 SP1</strong></td><td align="middle"><strong>VC9 SP1 <br/>SCL=0</strong></td><td align="middle"><strong>VC10</strong></td><td align="middle"><strong>VC11</strong></td></tr><tr height="20"><td align="right">vector<int></td><td align="middle">48</td><td align="middle">32</td><td align="middle">32</td><td align="middle">24</td></tr><tr height="20"><td align="right">array<int, 5></td><td align="middle">20</td><td align="middle">20</td><td align="middle">20</td><td align="middle">20</td></tr><tr height="20"><td align="right">deque<int></td><td align="middle">64</td><td align="middle">64</td><td align="middle">48</td><td align="middle">40</td></tr><tr height="20"><td align="right">forward_list<int></td><td align="middle">N/A</td><td align="middle">N/A</td><td align="middle">16</td><td align="middle">8</td></tr><tr height="20"><td align="right">list<int></td><td align="middle">56</td><td align="middle">24</td><td align="middle">24</td><td align="middle">16</td></tr><tr height="20"><td align="right">priority_queue<int></td><td align="middle">56</td><td align="middle">40</td><td align="middle">40</td><td align="middle">32</td></tr><tr height="20"><td align="right">queue<int></td><td align="middle">64</td><td align="middle">64</td><td align="middle">48</td><td align="middle">40</td></tr><tr height="20"><td align="right">stack<int></td><td align="middle">64</td><td align="middle">64</td><td align="middle">48</td><td align="middle">40</td></tr><tr height="20"><td align="right">pair<int, int></td><td align="middle">8</td><td align="middle">8</td><td align="middle">8</td><td align="middle">8</td></tr><tr height="20"><td align="right">tuple<int, int, int></td><td align="middle">16</td><td align="middle">16</td><td align="middle">16</td><td align="middle">12</td></tr><tr height="20"><td align="right">map<int, int></td><td align="middle">64</td><td align="middle">24</td><td align="middle">32</td><td align="middle">16</td></tr><tr height="20"><td align="right">multimap<int, int></td><td align="middle">64</td><td align="middle">24</td><td align="middle">32</td><td align="middle">16</td></tr><tr height="20"><td align="right">set<int></td><td align="middle">64</td><td align="middle">24</td><td align="middle">32</td><td align="middle">16</td></tr><tr height="20"><td align="right">multiset<int></td><td align="middle">64</td><td align="middle">24</td><td align="middle">32</td><td align="middle">16</td></tr><tr height="20"><td align="right">hash_map<int, int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">hash_multimap<int, int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">hash_set<int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">hash_multiset<int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">unordered_map<int, int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">unordered_multimap<int, int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">unordered_set<int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">unordered_multiset<int></td><td align="middle">144</td><td align="middle">88</td><td align="middle">88</td><td align="middle">64</td></tr><tr height="20"><td align="right">string</td><td align="middle">40</td><td align="middle">40</td><td align="middle">40</td><td align="middle">32</td></tr><tr height="20"><td align="right">wstring</td><td align="middle">40</td><td align="middle">40</td><td align="middle">40</td><td align="middle">32</td></tr></tbody></table>
赶紧下载VS11体验吧
[http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)