首页
社区
课程
招聘
[旧帖] [讨论]C结构体对齐方式 0.00雪花
发表于: 2009-7-4 16:55 5148

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

2009-7-4 16:55
5148
主要由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都是这个结果。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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