align指令可以用于设置各种内置类型、自定义类型如struct、union或class的的对齐方式。指令格式为: __declspec(align( # )) ,#是对齐值,取值为2的1次方至2的8192次方。在声明自定义类型或内置变量时,如果指定了对齐值,则对应变量的起始地址必须是该值的整数倍。除此外,它还会影响结构体的大小。
总结公式为:
sizeof(structure) = (结构体最后一个成员的偏移 + sizeof(结构体最后一个成员) ),所得数值扩充到max( 结构体各成员的最大对齐值,align(#)设置的值 )的整数倍;
下面以一代码来说明align(#)指令的用法:
#include <iostream>using namespace std;
#define CACHE_LINE 32
#define CACHE_ALIGN __declspec(align(CACHE_LINE))
#pragma pack(8)
struct CACHE_ALIGN S1
...{
int a, b, c, d;
};
struct S3
...{
struct S1 s1;
int a;
};
#pragma pack()
int _tmain(int argc, _TCHAR* argv[])
...{
CACHE_ALIGN int i = 2;
cout << sizeof(S1) << endl;
cout << sizeof(S3) << endl;
return 0;
}
运行程序输出32和64,按公式sizeof(structure) = (结构体最后一个成员的偏移 + sizeof(结构体最后一个成员) ) 所得数值扩充到max( 结构体各成员的最大对齐值,align(#)设置的值 )的整数倍; 分析:
sizeof(S1) = (12+4) 扩充( max( 4, 32 ) )的整数倍
sizeof(S1) = (16) 扩充到( 32 )
sizeof(S1) = 32