免费注册 查看新帖 |

Chinaunix

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

老问题 -- 结构体对齐问题,混了…… [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-25 13:03 |只看该作者 |倒序浏览
本帖最后由 geekjack 于 2011-06-25 13:08 编辑
  1. typedef struct{
  2.        double d;
  3.        char c;
  4.        char cc[3];
  5. }s1;

  6. typedef struct{
  7.        char cc[3];
  8.        double d;
  9.        char c;
  10. }s2;
复制代码
我是在XP下运行的。
这段代码得出的结果是sizeof(s1)等于16,sizeof(s2)等于24.
说下我的思路哈:
      s1应该是 8+1+3 = 12.  补齐4 等于16为double(的整数倍,不知道是不是这样理解。
      s2呢?  是如何对齐的呢?  
      我按OX占位老老实实算了一下,把自己算晕了……

还有一段代码:
  1. typedef struct{
  2.        char c[3];
  3.        long double ld;
  4.        char cc;
  5. }s3;
复制代码
这个当在VC6.0中运行时,sizeof(s3)结果为 24
         在DEV-C++中运行时,sizeof(s3)结果为20?
     ==>  已知 在vc中sizeof(long double)=8,在DEV-C++中sizeof(long double)=12  呵呵
问题太多,就先把这两个贴出来。先谢过各位了!

各位要是有什么好一点的原则,或是原理需要我去学习的,不妨教一下哈。这几天看了很多文章,试了N次,还是没搞太清楚,汗……

论坛徽章:
0
2 [报告]
发表于 2011-06-25 13:21 |只看该作者
大牛们  周末帮帮小弟……  {:2_168:}

论坛徽章:
0
3 [报告]
发表于 2011-06-26 07:08 |只看该作者
这个和编译器实现有关吧,刚才验证了下,GCC下long double 是12bytes,VC6.0下8bytes。
貌似GCC使用的是按整型对齐,对不是按长类型对齐。

论坛徽章:
0
4 [报告]
发表于 2011-06-26 22:33 |只看该作者
回复 3# duwei211

恩  应该正如您所说。
但我还是对这其中的对齐规则不大明白。
  1. typedef struct{
  2.        char cc[3];
  3.        double d;
  4.        char c;
  5. }s2;
复制代码
这段代码的sizeof(s2)在dev-c++和vc6.0中是等于24(win32系统)。我把它用g++测试 得到的是16……
我已经凌乱了……

最长对齐原则?还是默认对齐(4)?求教育……

刚才有前辈告诉我,实际应用中都有强制对齐,用#pragam pack(1)
(虽说会降低效率)

论坛徽章:
0
5 [报告]
发表于 2011-06-26 23:00 |只看该作者
typedef struct{
       double d;  //这里开始以8位为单元划分
       char c;
       char cc[3];    //这个数组进跟在上面那个字符后面,所以一共16字节
}s1;

typedef struct{
       char cc[3];
       double d;//这个最长,所以以这个八位为长度单位,前面那个数组后面5个位置空置
       char c;//这个后面7个位置空置。。所以一共是24字节
}s2;

论坛徽章:
0
6 [报告]
发表于 2011-06-26 23:09 |只看该作者
两个原则:
1:该成员之前必须按该成员对齐
2:整个结构体按最大成员对齐

论坛徽章:
0
7 [报告]
发表于 2011-06-26 23:16 |只看该作者
恩  多谢两位,现在清楚多了{:3_193:}
我也是这样算的  
  typedef struct {
  char cc[3];
  double ld;
  char c;
}s2;
现在有另外一个问题:为什么gcc中sizeof(s2)得到的是16?  
我的gcc version 4.2.1
操作系统是linux redflag 6.0。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2011-06-27 15:32 |只看该作者
我是在XP下运行的。
这段代码得出的结果是sizeof(s1)等于16,sizeof(s2)等于24.
说下我的思路哈:
      ...
geekjack 发表于 2011-06-25 13:03



    结构体的对齐没有固定长度,按结构内最大的成员对齐。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
9 [报告]
发表于 2011-06-27 15:37 |只看该作者
本帖最后由 yulihua49 于 2011-06-27 15:43 编辑
恩  多谢两位,现在清楚多了
我也是这样算的  
  typedef struct {
  char cc[3];
  double  ...
geekjack 发表于 2011-06-26 23:16


正确。gcc在32位系统,double的对齐规则是4。
64位系统是8。
vc是8。

我的结构计算程序都是对各种基本类型进行测试再计算结构成员偏移量和结构整体尺寸。

论坛徽章:
0
10 [报告]
发表于 2011-06-27 16:13 |只看该作者
这个和具体编译器实现有关吧
没有说一定按哪个标准来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP