首页 > 其他 > 详细

结构体对齐方式

时间:2014-03-05 21:52:39      阅读:607      评论:0      收藏:0      [点我收藏+]

对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。

语法:#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;

未完 待续。。。(没时间了!~)

结构体对齐方式,布布扣,bubuko.com

结构体对齐方式

原文:http://www.cnblogs.com/seer/p/3582932.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!