align指令

来源:互联网 发布:git 修改ssh 端口 编辑:程序博客网 时间:2024/06/03 11:17

      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

 

原创粉丝点击