alignof
计算机系统可能限制数据在内存的存储方式。例:
一个系统要求double值存储在编号为偶数的内存单元中,另一个系统要求起始地址为8个整数倍。运算符alignof将类型作为参数,并返回一个整数,指出要求的对齐方式。
例:对齐要求可能决定结构中信息的组织方式,如下面程序:
#include <iostream>
using namespace std;
struct things1
{
char ch;
int a;
double x;
};
struct things2
{
int a;
double x;
char ch;
};
int main()
{
things1 th1;
things2 th2;
cout<<"char alignment:"<<alignof(char)<<endl;
cout<<"int alignment:"<<alignof(int)<<endl;
cout<<"double alignment:"<<alignof(double)<<endl;
cout<<"things1 alignment:"<<alignof(things1)<<endl;
cout<<"things2 alignment:"<<alignof(things2)<<endl;
cout<<"things1 size:"<<sizeof(things1)<<endl;
cout<<"things2 size:"<<sizeof(things2)<<endl;
return 0;
}
两个结构对齐方式都为8,意味着结构长度是8的整数倍,这样创建结构数组时,每个元素的起始位置都是8的整数倍。每个结构的所有成员只占用13位,但结构要求占用为8的整数倍,意味着要填充一些位。每个结构中,double成员的对齐要求为8的整数倍,但在结构things1与things2中成员的排列顺序不同。导致things2需要更多内部填充,以便其边界处于正确的位置。
noexcept
关键字noexcept用于指出函数不会引发异常。它也可用作运算符,判断操作数(表达式)是否可能引发异常;如果操作数可能发生异常,则返回false否则true。例:
int hilt(int);
int halt(int)noexcept;
表达式noexcept(hilt)的结果为false,因为hilt()的声明未保证不会引发异常,但noexcept(halt)的结果为true。