《Visual C++ 2012 开发权威指南》——2.3 Visual C++2012的语言新特性(3)

简介:

本节书摘来自异步社区出版社《Visual C++ 2012 开发权威指南》一书中的第2章,第2.3节,作者: 尹成 , 朱景尧 , 孙明龙 , 胡耀文,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 Visual C++2012的语言新特性(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)。

相关文章
|
24天前
|
自然语言处理 编译器 C语言
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
37 0
|
25天前
|
Linux C++ iOS开发
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(二)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
237 2
|
25天前
|
Linux API C++
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(一)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
294 2
|
2天前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。
|
12天前
|
程序员 C++
C++语言模板学习应用案例
C++模板实现通用代码,以适应多种数据类型。示例展示了一个计算两数之和的模板函数`add&lt;T&gt;`,可处理整数和浮点数。在`main`函数中,展示了对`add`模板的调用,分别计算整数和浮点数的和,输出结果。
11 2
|
17天前
|
存储 C++
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
|
20天前
|
存储 安全 编译器
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】类的六大默认成员函数及其特性(万字详解)
35 3
|
23天前
|
算法 安全 编译器
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
23 1
|
22天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
存储 编译器 Linux
18 0