求助关于字节对齐的问题

qiuxi824039983 2012-03-19 08:37:50
01.#include<stdio.h>

02.

03.typedef struct engineer1

04.{

05. char name[10];

06. int id;

07. char department[10];

08.} B;

09.

10.typedef struct engineer2

11.{

12. int id;

13. char name[10];

14. char department[10];

15.} C;

16.

17.int main()

18.{

19. printf("%d %d %d",sizeof(B),sizeof(C));

21. getchar();

22. return 0;

23.}
为什么输出是24跟28?字节对齐的规则是什么?为什么需要字节对齐?希望大神可以帮忙解释下,谢谢
...全文
119 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-03-19
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!
自信男孩 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qiuxi824039983 的回复:]
引用 1 楼 nice_cxf 的回复:
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,一共24

为什么会有字节对齐这样的规则呢?能不能解答下……
[/Quote]
对于32位系统,cup一次处理的位数就是32位,如果四字节对齐,这样可以增加CPU的处理速度,提高效率。
小班得瑞 2012-03-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/diaodiaowen1987/article/details/6649405
自己看吧,说得很详细
qiuxi824039983 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nice_cxf 的回复:]
引用 3 楼 qiuxi824039983 的回复:

引用 1 楼 nice_cxf 的回复:
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,……
[/Quote]
哦哦,谢谢
qiuxi824039983 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ever_lover 的回复:]
引用 3 楼 qiuxi824039983 的回复:

引用 1 楼 nice_cxf 的回复:
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,……
[/Quote]
哦,谢谢
nice_cxf 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qiuxi824039983 的回复:]

引用 1 楼 nice_cxf 的回复:
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,一共24

为什么会有字节对齐这样的规则呢?能不能解答……
[/Quote]
因为操作系统是按照整位数来读写数据的,以32位为例,是4字节,那么系统读写数据开始位置都是4的整数倍
,如果不对齐,假定某个int是从奇数字节开始,那么操作系统读写该int需要花2个指令,降低了系统的效率
Ever_lover 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qiuxi824039983 的回复:]

引用 1 楼 nice_cxf 的回复:
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,一共24

为什么会有字节对齐这样的规则呢?能不能解答……
[/Quote]这好像是为了cpu寻址读数据的时候更快,具体到怎么问题汇编上和计算机组成上讲过,不过现在我忘了,,,,你可以百度下。。。
pengfoo 2012-03-19
  • 打赏
  • 举报
回复
qiuxi824039983 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nice_cxf 的回复:]
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,一共24
[/Quote]
为什么会有字节对齐这样的规则呢?能不能解答下?谢谢
Ever_lover 2012-03-19
  • 打赏
  • 举报
回复
一般来说编译器都是按照四字节对齐,那你第一个结构体来说吧char name[10];站十个字节, int id;站四个字节,由于char name不是四的倍数,而下面紧挨着是int正好是4字节,所以char name 要站12个字节,也就是说最后俩个字节没有四个的时候要不齐俩字节。 char department[10]; 同理这个数组也要站十二个字节,所以这个结构体要站28个字节。
.typedef struct engineer2

11.{

12. int id;

13. char name[10];

14. char department[10];

15.} C;再看这个,开始是int 站四个字节正好不用对齐,再看char name 和char department[10]; 因为char 都是一个字节 加起来是20个,正好是4的倍数所以是24个字节
nice_cxf 2012-03-19
  • 打赏
  • 举报
回复
28,24把?
b28,c24
B:char 10字节,int4字节,字节对齐要求起始位置要是本单元数据整数倍,因此从第12字节开始,前边补2个0
char 10字节,一共10+2+4+10=26,总字节数必须是最大单元的整数倍(基于VS系列),因此28
C就没啥好说的,什么都不需要加,一共24

69,374

社区成员

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

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