关于字节对齐问题

youkuwanhuo 2010-07-23 11:13:34
现在已知32位机器上各种数据类型的长度如下:
char:1(有符号无符号同)
short:2(有符号无符号同)
int:4(有符号无符号同)

设结构体如下定义:
struct A
{
int a;
char b;
short c;
};
struct B
{
char b;
int a;
short c;
};

结果是:
sizeof(strcut A)值为8
sizeof(struct B)的值却是12
这个是没有问题的

下面的
#pragma pack (2) /*指定按2字节对齐*/
struct C
{
char b;
int a;
short c;
};
结果是:
sizeof(struct C)值是8。


修改对齐值为1:
#pragma pack (1) /*指定按1字节对齐*/
struct D
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct D)值为7。

可以看出当指定对齐的字节越小 占用的内存空间就会越小,也就是说只要每次指定按1字节对齐占用的空间总是最少的,不知道是不是这样的
...全文
114 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
youkuwanhuo 2010-07-23
  • 打赏
  • 举报
回复
struct A
{
int a;
char b;
short c;
};
sizeof(strcut A)值为8

#pragma pack (2) /*指定按2字节对齐*/
struct B
{
int a;
char b;
short c;
};
#pragma pack()
结果是:
sizeof(struct B)值也是8。

那struct A和struct B这2个cpu的效率是怎么操作的,A在读写均是一次完成,而B在读取int a的时候是不是要读取2次,然后再拼接组成一个完整的int。
所以从效率上说A的要比B的效率高 是不是这样的?
  • 打赏
  • 举报
回复
笔误,缺省是4字节对齐
  • 打赏
  • 举报
回复
VC缺省是8字节对齐,一般定义struct时都是指定1字节对齐。
损失cpu效率什么什么的问题,只有在程序对效率特别要求时,才需要考虑。
按辩证法观点,事物都是矛盾统一的哈:)
vk2211 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 c00der 的回复:]

省了空间,但是严重降低cpu效率
[/Quote]
同意,因为32位CPU是4字节对齐的
  • 打赏
  • 举报
回复
是这样的,你理解的没错:)

原则上,定义struct成员量时,应大类型在前、小类型在后。
vanchristin 2010-07-23
  • 打赏
  • 举报
回复
肯定是这样。。。。
youkuwanhuo 2010-07-23
  • 打赏
  • 举报
回复
如果从空间上说是最省的,那请问时间上是怎么算的?
nkluckyfire 2010-07-23
  • 打赏
  • 举报
回复
hah 路过
c00der 2010-07-23
  • 打赏
  • 举报
回复
省了空间,但是严重降低cpu效率
lvshaoqing 2010-07-23
  • 打赏
  • 举报
回复
以后应该是8字节对齐啦。。。 哈哈!!!
lvshaoqing 2010-07-23
  • 打赏
  • 举报
回复
只要每次指定按1字节对齐占用的空间总是最少的,不知道是不是这样的???

基本上是的。 时间和空间的取舍而已。
zhaolinger2 2010-07-23
  • 打赏
  • 举报
回复
这个……
对齐的字节越小,浪费的空间就越少,当然空间使用量就越少了
这好像是个数学问题吧?
youkuwanhuo 2010-07-23
  • 打赏
  • 举报
回复
自己顶下
wyz007134 2010-07-23
  • 打赏
  • 举报
回复
struct A pack(4) struct B pack(2)
{ {
int a; int a;
char b; char b;
short c; short c;
}; };
上述两个结构体的大小都是8个字节,因为采用内存对齐的关系,采用内存对齐的原因或者说策略就是为了让结构中的每个元素的起始存储内存地址是对齐字节数(或最大元素字节数)的整数倍,这样CPU在读取该数据的时候,可以很方便的寻址(翻倍)就可以了。
假设上面两个结构体的a变量起始地址是0,占据0-3四个字节空间
那么对于A结构来说,b的起始地址就是4,是char长度的倍数,占据4这个空间
而c的起始地址是6,是short长度的倍数,占据2个空间6-7;
因此0-8这8个字节除了5号字节因为被对齐忽略以外都被占用了,然后每个元素占据内存的起始地址都是它长度的整数倍。
结构B同样,因此它们的效率是一样的。

如果 pack(1)
struct C
{
char a;
int b;
short c;
};
的话,a占据0号空间没有问题。b从1-4占据4个字节空间,但是起始地址从1开始并不是4的整数倍,这样就给CPU对b进行寻址时造成了困难。具体怎么个困难法,我不知道,但是可以想象。
因此结构C虽然少占据一个字节,但是在运行时间上会慢于结构A和B

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧