本节书摘来自异步社区出版社《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)。