6.6 本章小结

在本章中,我们首先看到了C++11中与性能极其相关的新特性:常量表达式constexpr。常量表达式通常可以用于修饰函数、变量以及构造函数等,以使得声明constexpr关键字的函数和变量可以被用于编译时的值计算。这样一来,一些本是运行时常量的运算却可以被合理地放到编译时,而一些语法上的限制也被常量表达式解放了出来。而由constexpr演化出的constexpr元编程则成了C++中继模板元编程之后又一个可以进行编译时值计算的手段。而其超越模板元编程的各种优势,使得其应用前景被广泛看好。

变长模板是C++引入的新的“变长”参数的工具,不过远胜于变长宏和变长函数。变长模板通过模板偏特化以及一些递归引用的定义,可以在不丢失类型信息的情况下实现变长参数的传递。从某种意义上讲,变长模板把泛型编程又推向了一个新的高度,也使得变长模板在库编写的领域有着很好的应用。

而原子操作则彻底宣告C++来到了并行编程和多线程的时代。相比于偏于底层的pthread库,C++通过定义原子类型的方式,轻松地化解了互斥访问同步变量的难题。不过C++也延续了其易于学习难于精通的特性。虽然原子类型使用很简单,但其成员变量(原子操作)却可以有各种不同的内存顺序。C++11从各种不同的平台上抽象出了一个软件的内存模型,并以内存顺序进行描述,以使得想进一步挖掘并行系统性能的程序员有足够简单的手段来完成以往只能通过内联汇编来完成的工作。这样的高度总结和设计,也堪称C++11中的一大亮点。

此外,为了适应并行编程,C++11还将广泛存在的线程局部存储进行了语法上的统一。并且标准也为TLS留下了足够的余地,以适应于各种平台的TLS的实现。quick_exit则是一项多线程情况下的新发明,可以用于解除因为退出造成的死锁等不良状态。不过读者也可以尝试着使用它来免除大量的不必要的析构函数调用。

总的看来,C++11除了突破自身语法,除了在泛型编程的技巧上更上一层楼外,也延续了C和以前C++版本对硬件操控的强能力,而且将这种能力带入了并行和多线程的时代。虽然这可能带来一些学习的代价,不过这些能力常常是其他语言难以具备的。因此,真正了解这些新特性,可以让使用者可以更轻松地完成各种复杂的工作。对于一些程序员来讲(比如库开发人员,系统级的程序员),这是一种简化,而不是复杂化。