返回介绍

18.7 C++11 新增的其他功能

发布于 2024-10-08 23:14:14 字数 2730 浏览 0 评论 0 收藏 0

C++11 增加了很多功能,本书无法全面介绍;另外,本书编写期间,其中很多功能还未得到广泛实现。然而,有些功能有必要简要地介绍一下。

18.7.1 并行编程

当前,为提高计算机性能,增加处理器数量比提高处理器速度更容易。因此,装备了双核、四核处理器甚至多个多核处理器的计算机很常见,这让计算机能够同时执行多个线程,其中一个处理器可能处理视频下载,而另一个处理器处理电子表格。

有些操作能受益于多线程,但有些不能。考虑单向链表的搜索:程序必须从链表开头开始,沿链接依次向下搜索,直到到达链表末尾;在这种情况下,多线程的帮助不大。再来看未经排序的数组。考虑到数组的随机存取特征,可让一个线程从数组开头开始搜索,并让另一个线程从数组中间开始搜索,这将让搜索时间减半。

多线程确实带来了很多问题。如果一个线程挂起或两个线程试图同时访问同一项数据,结果将如何呢?为解决并行性问题,C++定义了一个支持线程化执行的内存模型,添加了关键字 thread_local,提供了相关的库支持。关键字 thread_local 将变量声明为静态存储,其持续性与特定线程相关;即定义这种变量的线程过期时,变量也将过期。

库支持由原子操作(atomic operation)库和线程支持库组成,其中原子操作库提供了头文件 atomic,而线程支持库提供了头文件 thread、mutex、condition_variable 和 future。

18.7.2 新增的库

C++11 添加了多个专用库。头文件 random 支持的可扩展随机数库提供了大量比 rand( ) 复杂的随机数工具。例如,您可以选择随机数生成器和分布状态,分布状态包括均匀分布(类似于 rand( ))、二项式分布和正态分布等。

头文件 chrono 提供了处理时间间隔的途径。

头文件 tuple 支持模板 tuple。tuple 对象是广义的 pair 对象。pair 对象可存储两个类型不同的值,而 tuple 对象可存储任意多个类型不同的值。

头文件 ratio 支持的编译阶段有理数算术库让您能够准确地表示任何有理数,其分子和分母可用最宽的整型表示。它还支持对这些有理数进行算术运算。

在新增的库中,最有趣的一个是头文件 regex 支持的正则表达式库。正则表达式指定了一种模式,可用于与文本字符串的内容匹配。例如,方括号表达式与方括号中的任何单个字符匹配,因此[cCkK]与 c、C、k 和 K 都匹配,而[cCkK] at 与单词 cat、Cat、kat 和 Kat 都匹配。其他模式包括与一位数字匹配的\d、与一个单词匹配的\w、与制表符匹配的\t 等。在 C++中,斜杠具有特殊含义,因此对于模式\d\t\w\d(即依次为一位数字、制表符、单词和一位数字),必须写成字符字面量“\d\t\w\d”,即使用\表示\。这是引入原始字符串的原因之一(参见第 4 章),它让您能够将该模式写成 R“\d\t\w\d”。

ed、grep 和 awk 等 UNIX 工具都使用正则表达式,而解释型语言 Perl 扩展了正则表达式的功能。C++正则表达式库让您能够选择多种形式的正则表达式。

18.7.3 低级编程

低级编程中的“低级”指的是抽象程度,而不是编程质量。低级意味着接近于计算机硬件和机器语言使用的比特和字节。对嵌入式编程和改善操作的效率而言,低级编程很重要。C++11 给低级编程人员提供了一些帮助。

变化之一是放松了 POD(Plain Old Data)的要求。在 C++98 中,POD 是标量类型(单值类型,如 int 或 double)或没有构造函数、基类、私有数据、虚函数等的老式结构。以前的理念是,POD 是可安全地逐字节复制的东西。这种理念没变,但 C++11 认识到,在满足 C++98 的某些约束的情况下,仍可以是合法的 POD。这有助于低级编程,因为有些低级操作(如使用 C 语言函数进行逐字节复制或二进制 I/O)要求处理对象为 POD。

另一项修改是,允许共用体的成员有构造函数和析构函数,这让共用体更灵活;但保留了其他一些限制,如成员不能有虚函数。在需要最大程度地减少占用的内存时,通常使用共用体;上述新规则在这些情况下给程序员有更大的灵活性和功能。

C++11 解决了内存对齐问题。计算机系统可能对数据在内存中的存储方式有一定的限制。例如,一个系统可能要求 double 值的内存地址为偶数,而另一个系统可能要求其起始位置为 8 的整数倍。要获悉有关类型或对象的对齐要求,可使用运算符 alignof( )(参见附录E)。要控制对齐方式,可使用说明符 alignas。

constexpr 机制让编译器能够在编译阶段计算结果为常量的表达式,让 const 变量可存储在只读内存中,这对嵌入式编程来说很有用(在运行阶段初始化的变量存储在随机访问内存中)。

18.7.4 杂项

C99 引入了依赖于实现的扩展整型,C++11 继承了这种传统。在使用 128 位整数的系统中,可使用这样的类型。在 C 语言中,扩展类型由头文件 stdint.h 支持,而在 C++中,为头文件 cstdint。

C++11 提供了一种创建用户自定义字面量的机制:字面量运算符(literal operator)。使用这种机制可定义二进制字面量,如 1001001b,相应的字面量运算符将把它转换为整数值。

C++提供了调试工具 assert。这是一个宏,它在运行阶段对断言进行检查,如果为 true,则显示一条消息,否则调用 abort( )。断言通常是程序员认为在程序的某个阶段应为 true 的东西。C++11 新增了关键字 static_assert,可用于在编译阶段对断言进行测试。这样做的主要目的在于,对于在编译阶段(而不是运行阶段)实例化的模板,调试起来将更简单。

C++11 加强了对元编程(metaprogramming)的支持。元编程指的是编写这样的程序,它创建或修改其他程序,甚至修改自身。在 C++中,可使用模板在编译阶段完成这种工作。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文