对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
语法:#pragma pack( [show] | [push | pop] [, identifier], n )
对齐的算法: 由于各个平台和编译器的不同,可能会有所不同,本文是在window 2008 32位系统 vs2005上尝试的。
在不指定对齐方式时 编译器默认大小为8
可以通过命令 #pragma pack (show) 查看
那就从默认的开始说起,由于默认是8 ,结构体如下
typedef struct TEST_S
{
char b;
int a;
short c;
};
sizeof(TEST_S) = ? 应该是12,为何?
原因:
假设TEST_S从地址空间0x0000开始存放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。
第一个成员变量b的自身对齐值是1,比指定或者默认指定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.
第二个成员变量a,其自身对齐值为4,所以有效对齐值也为4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,符合0x0004%4=0,
且紧靠第一个变量。
第三个变量c,自身对齐值为2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的都是B内容。
再看数据结构B的自身对齐值为其变量中最大对齐值(这里是b)所以就是4,所以结构体的有效对齐值也是4。根据结构体圆整的要求,0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也为结构体B所占用。故B从0x0000到0x000B共有12个字节,sizeof(struct
B)=12;
未完 待续。。。(没时间了!~)
原文:http://www.cnblogs.com/seer/p/3582932.html