首页
论坛
课程
招聘
[旧帖] [讨论]C结构体对齐方式 0.00元
2009-7-4 16:55 4482

[旧帖] [讨论]C结构体对齐方式 0.00元

2009-7-4 16:55
4482
主要由aoanzhishu  
的问题引出http://bbs.pediy.com/showthread.php?t=92718

前边的答案不多说了,只讨论最后2个的答案。
sizeof为编译时运算符。也就是说编译器在编译的时候已经算出结果在汇编代码里已经换成固定值了。
所以说sizeof的值是多少基本上就是编译器说的算和目标机器无关。

至于结构体C编译器如何确定大小,基本原则如下。

1、取结构体中将其中所有成分展开,寻找最大的基本类型。体积最大的一个基本元素作为对齐标准。(基本元素就是C的原生类型)
2、以对齐标准对其其中的每个元素(没有展开的)。其值为sizeof的值(也就是元素在内存中存放方式)

例子:
struct{
  short a1;
  short a2;
  short a3;
}A;
对齐标准为2,大小为2+2+2

struct{
  long a1;
  short a2;
}B;
对齐标准为4,大小为4+4

struct K {
  char a3[5];
  short a4[2];
}A;
struct L {
  int a5;
  char a2;
}B;
struct{
  K a0;
  L a1;
  char l1;
}C;
A标准为2,大小为2×3+2×2;B为4大小为4+4;C标准为4大小为4×3(10的对其结果)+4×2+4=24

至于以上结论是不是C的标准规定就不了解了。VC和GCC都是这个结果。

【公告】看雪团队招聘安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 104
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
dannylai 活跃值 1 2009-7-4 18:32
2
0
可以看看"深入C++对象模型"这本书!解释也很清楚!
其次,编译器是利用pragma进行内存对齐指定的,在同一种的操作系统上这个情况一般是可以忽略的,但是,在内嵌式编程里,对协议影响极大!!!
雪    币: 143
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Yangs 活跃值 2009-7-4 18:39
3
0
pragma也是静态对齐的吧。没做试验。不过好像没见过机制能让操作系统在载入的时候动态改变程序的变量对齐。重定位估计也会费些劲。
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kackyan 活跃值 2009-7-4 22:56
4
0
明白了 多谢LZ
雪    币: 1484
活跃值: 活跃值 (96)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
cmdxhz 活跃值 1 2009-7-5 02:22
5
0
不过可以用
#pragma pack
这个指令来设置对齐
雪    币: 246
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SFILTER 活跃值 2009-7-20 16:58
6
0
struct{
  short a1;
  short a2;
  short a3;
}A;
他的大小为三
游客
登录 | 注册 方可回帖
返回