第18 章探讨 C++新标准. 低级编程,杂项
第18 章探讨 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)。使用这种机制可定义二进制字面量,如10010016,相应的字面量运算符将把它转换为整数值。C++提供了调试工具 assert。这是一个宏,它在运行阶段对断言进行检查,如果为true,则显示一条消息,否则调用 abort()。断言通常是程序员认为在程序的某个阶段应为true 的东西。C++11 新增了关键字static assert,可用于在编译阶段对断言进行测试。这样做的主要目的在于,对于在编译阶段(而不是运行阶段)实例化的模板,调试起来将更简单。
C++11 加强了对元编程(metaprogramming)的支持。元编程指的是编写这样的程序,它创建或修改其他程序,甚至修改自身。在C+中,可使用模板在编译阶段完成这种工作。