免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5860 | 回复: 18
打印 上一主题 下一主题

内存对齐问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-26 13:42 |只看该作者 |倒序浏览
在struct、class中编译器会进行内存对齐,如
  1. #include <stdio.h>
  2. typedef struct
  3. {
  4. char a;
  5. int b;
  6. int c;
  7. } A;
  8. typedef struct
  9. {
  10. char a;
  11. short b;
  12. int c;
  13. } B;
  14. int main()
  15. {
  16. printf("%d\t%d\n", sizeof(A), sizeof(B));
  17. return 0;
  18. }
复制代码
结果是:12    8
但为什么short的对齐是2而不是int的4;(对齐方式是与sizeof成正比)
为什么这样对齐效率才高?

论坛徽章:
0
2 [报告]
发表于 2010-04-26 13:51 |只看该作者
对齐一般都是以4字节为单位的,现在的PC一般都是32位,很多指令都是以1个字进行操作的,所以对齐后效率会较高,如果跨字的,有些一个节拍可以完成的就要花2个节拍才能完成。。。
还有short  2个字节的,是因为前面是一个1字节,所以会连在一起的,对齐并不是每个类型都以4个字节算的。。。比如你定义了2个char的,那么这2个char一般也是连续的

论坛徽章:
0
3 [报告]
发表于 2010-04-26 14:00 |只看该作者
回复 2# wjefen

我的机子是64位的

论坛徽章:
0
4 [报告]
发表于 2010-04-26 14:11 |只看该作者
我想起来了;
汇编中的mov,add等指令都有1,2,4字节的,它们的寻址应该是只能寻1,2,4的倍数更快,
那float,double,long double又是为什么这样对齐的?
我的x86_64_linux-gcc上float,double,longdouble 分别是4,8,16字节,
对齐也分别是4,8,16

论坛徽章:
0
5 [报告]
发表于 2010-04-26 14:26 |只看该作者
回复 1# zxrjkl


    说实话,我有点看不懂你想说什么,第二个结果不是8的话,你觉得应该是多少?

论坛徽章:
0
6 [报告]
发表于 2010-04-26 14:29 |只看该作者
回复 5# pengjianbokobe
结果我也知道;
我想知道为什么对齐的位数是这么多,而不是别的数字如8;
如把short也对齐到8字节的整数倍上,而不只是2的整数倍

论坛徽章:
0
7 [报告]
发表于 2010-04-26 14:48 |只看该作者
我看了一下double相加和long double相加的汇编结果,原来它们都是有一条指令实现的,
所以,double要对齐到8,long double对齐到16,但这个汇编结果我看不懂,请教大牛:
这是long double相加的;
  1.         fldt        -48(%rbp)
  2.         fldt        -32(%rbp)
  3.         faddp        %st, %st(1)
  4.         fstpt        -16(%rbp)
复制代码
这种指令有谁懂吗?

论坛徽章:
0
8 [报告]
发表于 2010-04-26 15:15 |只看该作者
给你说了方便理解的方法:
    比如内存按4字节对齐。你把4字节的空间当个有个4个格子的容器。
    这样对于struct A: 成员a是char,是1个字节,就这样4个格子只剩下3个了;而成员b是4个字节,3个格子放不下,并且b又不能拆开,所以只有用个新的容器去放。c也是4个字节,再拿的新的容器去放。这样为了装下A所有的成员,用了3个容器,每个容器4个格子,一共用了12个格子。
    对于struct B:成员a是char ,1个字节。放进去后还有3个格子。成员b是short,2个字节,能装到剩下的3个格子里。这样还有1个格子。成员c是int ,4个格子。1个格子装不下,并且c又不能拆开,所以只有用个新的容器去放。这样为了装下B所有的成员,用了2个容器,每个容器4个格子,一共用了8个格子。
所以结果是12 ,8 。
说了乱了点,能明白就好。
这是在编译器默认的结构排布方式下的。

32位机器,32位地址,内存4字节对齐是充分考虑了读写效率和存储效率的。当然你一定要用非主流的对齐方式也没问题,不过那时候感觉机器运行速度慢,别骂人就行。

32位的程序,用8字节对齐,很浪费内存的。即使你CPU是64位的。

论坛徽章:
0
9 [报告]
发表于 2010-04-26 15:52 |只看该作者
回复 8# star1983653
懂了,就是要兼顾时间和空间,
那如果我都按一个比较大的数对齐,如16;
那速度会不会更快一点

论坛徽章:
0
10 [报告]
发表于 2010-04-26 16:07 |只看该作者
那你觉得32位机器,能一次读16个字节吗??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP