align指令

      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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值