《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)。

相关文章
|
6天前
|
监控 API 数据库
C/C++ 开发SCM服务管理组件
SCM(Service Control Manager)服务管理器是 Windows 操作系统中的一个关键组件,负责管理系统服务的启动、停止和配置。服务是一种在后台运行的应用程序,可以在系统启动时自动启动,也可以由用户或其他应用程序手动启动。本篇文章中,我们将通过使用 Windows 的服务管理器(SCM)提供的API接口,实现一个简单的服务管理组件的编写。
C/C++ 开发SCM服务管理组件
|
23天前
|
Web App开发 存储 数据库
2023Linux C/C++全栈开发知识技术合集(基础入门到高级进阶)(下)
2023Linux C/C++全栈开发知识技术合集(基础入门到高级进阶)
|
23天前
|
存储 Linux 调度
2023Linux C/C++全栈开发知识技术合集(基础入门到高级进阶)(上)
2023Linux C/C++全栈开发知识技术合集(基础入门到高级进阶)
|
23天前
|
Web App开发 存储 Linux
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)(下)
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
|
23天前
|
存储 Linux 调度
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)(上)
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
|
23天前
|
存储 JSON Linux
Linux C/C++开发上线项目(后端、音视频、存储、QT)
Linux C/C++开发上线项目(后端、音视频、存储、QT)
|
2月前
|
Linux C语言 C++
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++(二)
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++(二)
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++(二)
|
2月前
|
Linux 网络安全 开发工具
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++(一)
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++
|
3月前
|
存储 C语言 C++
实战C++:如何开发一个完整的学生信息管理系统?
先简单介绍一下这篇文章,这是一篇关于C++的学生管理系统的文章,作为从C语言到C++过渡的项目。
45 0
|
3月前
|
存储 Linux Android开发
会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!
会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!
92 0
相关产品
云迁移中心
推荐文章
更多