有一种新的 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++基础,熟悉啥是 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 标准,已实施可怕的迭代器,所形容的"最小化依赖项内泛型类的快和小程序" N2911和N2980 "可怕的迭代器分配和初始化,修订 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开发指南,英文版资料,目前还没有中文版哦!不过值得观看哦!(分成了两部压缩卷哦!此卷为第二部分哦!)
主要内容:Metro新特性、Visual Studio 2012九大新功能,Visual C++ 2012语言新特性,Visual C++ 2012的异步编程与网络编程,实现并行编程充分利用多核处理能力,基于Visual C++充分使用GPU的计算能力,使用Lambda、...
这些 redistributables 是由微软公司为Visual Studio 2013版本提供的,它们是运行使用Microsoft Visual C++编译器开发的程序所必需的运行时库。标题中的“Visual C++ Redistributable Packages for Visual Studio ...
《最新Visual C++ 6.0开发指南》是一份针对微软经典的编程工具——Visual C++ 6.0的详尽教程。Visual C++ 6.0是微软在20世纪末发布的集成开发环境(IDE),它结合了C++编译器、调试器和其他辅助开发工具,为程序员...
《Visual C++ 6.0开发指南》是一本专注于C++编程语言在...不过要注意,虽然Visual C++ 6.0是一个经典版本,但后续版本如Visual Studio 2019等引入了许多新特性和改进,因此在深入学习后,也应该适时关注现代C++的发展。
在编程领域,Visual Studio是一款备受推崇的集成开发环境(IDE),尤其对于C++开发者来说,它提供了丰富的功能和工具。然而,尽管Visual Studio本身已经相当强大,但有时它在默认设置下可能并未启用C++的完整智能...
总之,《Visual C++ 2010 入门教程》完全版是一个针对C++初学者的实践指南,旨在帮助他们理解如何在Visual Studio 2010环境下进行有效的C++开发,同时澄清了Visual Studio、Visual C++与C++之间的关系,强调了理论...
Visual C++是微软公司推出的集成开发环境(IDE),支持C++语言,提供丰富的功能,包括编译器、调试器、资源编辑器以及对MFC(Microsoft Foundation Classes)库的支持。MFC是一套C++类库,用于简化Windows API的使用...
Visual Studio .NET是微软推出的针对.NET Framework开发的应用程序的IDE,它支持多种编程语言,如C#、VB.NET、C++等。其特点包括: 1. **集成开发环境**:Visual Studio提供了一个统一的工作空间,用户可以在这里...
- **Developer Studio**:这是 Visual C++ 6.0 的集成开发环境(IDE),它包含了编写、编译、调试 C/C++ 程序所需的所有工具。Developer Studio 提供了一个用户友好的界面,使得开发者能够高效地完成工作。 - **...
在Visual Studio 2010中,Visual C++是一个强大的集成开发环境(IDE),它支持C++标准,包括C++11的新特性,并且集成了对MFC(Microsoft Foundation Classes)和ATL(Active Template Library)的支持,使得Windows...
- **使用Visual C++ 2010的新特性**: - 探索Visual C++ 2010中新引入的标准模板库(STL)组件。 - 学习并应用新增的语法特性,如自动类型推断等。 #### 四、进阶指南 - **高级调试技术**: - 使用条件断点。 -...
Visual Studio .NET是微软公司推出的面向对象的、组件化的、集成的开发平台,支持多种编程语言,如C#、Visual Basic .NET、C++、F#等。它集成了项目管理、代码编辑、调试、版本控制、测试等多种功能,为开发者提供了...
2. **编程语言支持**:Visual Studio .NET支持C#、VB.NET、C++/CLI等多种.NET框架下的语言,文档可能会详细解析每种语言的特点和应用场景。 3. **项目和解决方案管理**:如何创建、管理项目和解决方案,理解项目的...
同时,书中还介绍了Visual C++ 2010的新特性,如新的STL组件和语法支持,以帮助读者跟上C++技术的最新发展。 总之,《Microsoft Visual Studio C++ 2010入门经典完全版》是一本全面且实用的指南,为初学者提供了一...
Visual Studio 2022 是微软最新发布的集成开发环境(Integrated Development Environment, IDE),它支持多种编程语言和技术栈,如.NET、C++、Python、JavaScript 等。这款强大的工具旨在帮助开发者高效地构建各类...
Visual Studio是全球最广泛使用的软件开发平台之一,支持多种编程语言,如C#、C++、VB.NET、Python、JavaScript等。其核心特性包括: 1. **强大的代码编辑器**:Visual Studio提供了智能感知、语法高亮、自动完成、...
总的来说,《Professional Visual Studio® 2005》这本书会深入讲解如何在Vista环境下有效地使用Visual Studio 2005进行开发,涵盖了从基本的编程概念到高级的框架特性和开发策略,是Vista时代开发者的实用指南。...
.NET Framework 是Visual Studio .NET的核心组件,它提供了一套全面的类库,包括基础类、网络通信、数据库访问等,使得开发者可以使用C#、VB.NET、C++等.NET兼容的语言编写应用程序。框架中的Common Language ...
- **Visual Studio**:Visual Studio 是一套由微软公司开发的集成开发环境 (IDE),适用于多种编程语言的开发需求,包括但不限于 C#, F#, Visual Basic, C++, Python 和 Node.js。 - **代码编辑器**:提供语法高亮、...