计算机系统可能限制数据在内存中的存储方式。例如,一个系统可能要求double值存储在编号为偶数的内存单元中,而另一个系统可能要求其起始地址为8个整数倍。运算符alignof将类型作为参数,并返回一个整数,指出要求的对齐方式。例如,对齐要求可能决定结构中信息的组织方式,以方便用于跨平台编程等。
下面写段代码来测试各类型对齐方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//梁笔记 //zouzhongliang.com #include <iostream> using namespace std; struct struct_Test1 { char c; int i; double d; }; struct struct_Test2 { char c; double d; int i; }; int _tmain(int argc, _TCHAR* argv[]) { struct_Test1 test1; struct_Test2 test2; cout<<"char alignment:"<<alignof(char)<<endl; cout<<"int alignment:"<<alignof(int)<<endl; cout<<"double alignment:"<<alignof(double)<<endl; cout<<"test1 alignment:"<<alignof(test1)<<endl; cout<<"test2 alignment:"<<alignof(test2)<<endl; cout<<"test1 size:"<<sizeof(test1)<<endl; cout<<"test1 size:"<<sizeof(test2)<<endl; system("pause"); return 0; } |
alignof测试结果:
1 2 3 4 5 6 7 8 |
char alignment:1 int alignment:4 double alignment:8 test1 alignment:8 test2 alignment:8 test1 size:16 test1 size:24 请按任意键继续. . . |
两个结构的对齐要求都是8。这意味着结构长度将是8的整数倍,这样创建结构数组时,每个元素的起始位置都是8的整数倍。
每个结构的所有成员只占用13位,但结构要求占用的位数为8的整数倍,这意味着需要填充一些位。在每个结构中,double成员的对齐要求为8的整数倍,但在结构test1 和test2,成员的排列顺序不同,这导致test2需要更多的内部填充,以便其边界处于正确的位置。