对于字节对齐的二次探究

对于字节对齐的二次探究

字节对齐(#pragma pack)的机制,原先已经在上一篇文章(字节对齐(#pragma pack))中已经说明了,但是如果我们如果不指定对齐方式的话,编译器会有一个默认对齐方式。

这个默认对齐方式是:按照数据类型的最大成员为默认对齐方式。

总结:
一般地,可以通过下面的方法来改变缺省的对界条件:

  • 使用伪指令#pragma pack (n),编译器将按照n 个字节对齐;
  • 使用伪指令#pragma pack (),取消自定义字节对齐方式。

注意:
在对齐的时候,拿数据类型和默认对齐方式比较,谁小按照谁对齐。
例子:
[cpp]#include “stdafx.h”

struct link
{
char c;
int a;
int d[5];
double b;
};

int _tmain(int argc, _TCHAR* argv[])
{

struct link x;
printf(“%d\n”,sizeof(x));
printf(“c=%d\n”,&x.c); //打印内存地址
printf(“a=%d\n”,&x.a); //同上
printf(“%0x\n”,&x.d[0]);
printf(“%d\n”,&x.d[1]);
printf(“%d\n”,&x.d[2]);
printf(“%d\n”,&x.d[3]);
printf(“%d\n”,&x.d[4]);
printf(“%d\n”,&x.b);
return 0;
}[/cpp]
过程分析:

  • 默认对齐方式是8
  • char c的时候 是1字节,偏移量0;
  • int a的时候,偏移量4;内存开始地址:1(c)+3(补) = 4
  • int d[5],偏移量4;内存开始地址:1(c)+3(补)+4(a) = 8
  • doube b,偏移量是8,内存开始地址是:1(c)+3(补)+4(a)+20(d)+4(补) = 32

最后:32 + 8 = 40,40是8的倍数(整体对齐),所以为40.