免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-03 16:29 |只看该作者 |倒序浏览
cpu对于内存对齐的原则大概是:对于n字节的元素,它的首地址能被n整除;相当于结构体占用的内存必定是结构中占用最大空间的类型所占用的字节数的倍数。

对于结构体

  1. struct test{
  2. double a;
  3. int b;
  4. };

  5. struct test1{
  6. long a;
  7. short b;
  8. };
复制代码


我在linux下测试,结果是:
sizeof(struct test) = 12;sizeof(struct test1) = 8;
12并不是sizeof(double)的倍数,怎么理解?如果按照对齐原则,应该是16。

[ 本帖最后由 kukule75 于 2008-7-3 16:50 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2008-07-03 16:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-07-03 16:39 |只看该作者
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
按两个字节对齐,sizeof怎么是6呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-07-03 16:41 |只看该作者
原帖由 Godbach 于 2008-7-3 16:39 发表
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
按两个字节对齐,sizeof怎么是6呢?


按两个字节对齐,应该是8

论坛徽章:
0
5 [报告]
发表于 2008-07-03 16:43 |只看该作者
原帖由 Godbach 于 2008-7-3 16:41 发表


按两个字节对齐,应该是8


因该市笔误了。。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2008-07-03 16:44 |只看该作者
原帖由 kukule75 于 2008-7-3 16:43 发表


因该市笔误了。。。


刚刚测试了一下你的那个struct,确实是12。会不会是编译器默认按照4个字节对齐。这正好是32位CPU的字长。

论坛徽章:
0
7 [报告]
发表于 2008-07-03 16:46 |只看该作者
原帖由 Godbach 于 2008-7-3 16:44 发表


刚刚测试了一下你的那个struct,确实是12。会不会是编译器默认按照4个字节对齐。这正好是32位CPU的字长。


应该很明确了。sizeof(double)超过了处理器的位数,按照处理器的位数对齐(而不是按结构体最大类型值对齐)

[ 本帖最后由 kukule75 于 2008-7-3 16:48 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
8 [报告]
发表于 2008-07-03 16:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2008-07-03 16:59 |只看该作者
原帖由 c/unix 于 2008-7-3 16:57 发表



我也测试了你那个

在gcc下是12,
在vc下是16,奇怪。。。期待flw来解释。。。


会不会取决于编译器啊

论坛徽章:
0
10 [报告]
发表于 2008-07-03 17:00 |只看该作者
http://bbs.chinaunix.net/viewthr ... t=scutan&page=1
我以前问过的, 实际上就是编译器的原因而已.
另外,在gcc中可以使用__alignof__运算符来查看一个类型的对齐数是多少.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP