免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: liuke432
打印 上一主题 下一主题

关于结构体的sizeof,大家帮忙看看 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-18 12:32 |只看该作者
都是4字节对齐

论坛徽章:
0
12 [报告]
发表于 2006-12-18 12:36 |只看该作者
感谢各位,基本上明白了。
感觉下面这个规则表达的比较清楚

  1. 字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

  2. 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  3. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
  4. 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
复制代码

论坛徽章:
0
13 [报告]
发表于 2006-12-18 12:51 |只看该作者
似乎也不一定是4个字节,
应该说是以偶数字节对齐,这样编译器可以从偶数位开始读,一个处理机时间就可以读完了。
如果在奇数地址位开始,就要读两次。

论坛徽章:
0
14 [报告]
发表于 2006-12-18 14:26 |只看该作者
按常用寄存器的宽度对齐,32位机上是四字节,16位机上是2字节,cpu访问速度最快。一个时钟周期就可以访问。

论坛徽章:
0
15 [报告]
发表于 2006-12-18 17:55 |只看该作者
原帖由 liuke432 于 2006-12-18 12:36 发表
感谢各位,基本上明白了。
感觉下面这个规则表达的比较清楚
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体 ...




这个说的已经比较清楚了,但需要注意的是,并不是只有结构体才对齐,内存中的变量一般都要求对齐。
对齐规则大概总结是这样的:

linux一般采用这样的对齐策略:2字节的数据类型地址必须是2的倍数,也就是两字节对齐。较大的数据类型如int、指针,地址应该是4的倍数,也就是4字节对齐。(当我在最近的kernel版本2.6.16.33中看到的似乎更像是下面提到的微软对齐原则)

微软的对齐更为严格,n字节的基本对象的地址为n的倍数,例如double类型的地址必须是8的倍数。

可以运行下面的程序,会发现几个变量不是紧密排列的,通过各个变量的地址,就可以知道自己机器上的是如何对齐的了:

  1. 1 #include <stdio.h>
  2.       2
  3.       3 int main()
  4.       4 {   
  5.       5     char a;
  6.       6     int b;
  7.       7     double c;
  8.       8     short d;
  9.       9     
  10.      10     printf("%p\t%p\t%p\t%p\n", &a, &b, &c, &d);
  11.      11 }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP