| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1378 人关注过本帖
标题:GCC编译器是如何计算结构体的大小的啊
只看楼主 加入收藏
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:5 
GCC编译器是如何计算结构体的大小的啊
struct b{
      char c;
      int a;
      short b;
      double d;
 };

GCC的计算大小是20 ;
VC的计算大小是24


GCC编译器是如何计算结构体大小的啊?
是不是最后末尾的填充大小不计算的啊;


结构体默认的字节对齐一般满足三个准则:
(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
(2) 结构体每个成员相对于结构体首地址的偏移量(offset) 都是成员自身大小的整数倍,
        如有需要,编译器会在成员之间加上填充字节(Internal Adding)。
(3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,
    如有需要, 编译器会在最末一个成员之后加上填充字节(Trailing Padding)。

上面第三条对GCC是不是不管用啊????
搜索更多相关主题的帖子: 如何 结构体 编译器 填充 计算 
2012-04-15 15:31
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
在MinGW下测试了一下。结果也为24。观察各成员的存储地址是符合准则的。没有Linux,呵呵没法实际观察纯正的GCC编译出来的各成员的存储情况,很不好意思。

一个建议,可能你也知道,算是给不知道的其他朋友提个醒,变量的声明顺序尽量按其实际宽度从大到小声明,这样可以节省内存空间。原因参看内存对齐相关资料。

以个这结构为例,改成下面的声明方式在MinGW下的大小将变成16(不敢乱说GCC下的结果)
struct b{
    double d;
    int a;
    short b;
    char c;
 };
 

重剑无锋,大巧不工
2012-04-15 18:55
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 2楼 beyondyf
《编写高质量代码:改善C++程序的150个建议》说是从小到大
原理应该是一样的,就是尽量使其对齐,尽量少填充字符, 纯个人理解,如果错望指正

看来那书被我发现BUG了,GCC下应该他最后面的填充大小不算的,
看来他书写的不全面啊,哈哈^_^

GCC下运行的结果:
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-04-15 21:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,你的书也不一定错,又做了一点测试,似乎两者的结果都一样。或许我该修改一下我的看法了

重剑无锋,大巧不工
2012-04-15 21:56
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 4楼 beyondyf
似乎两者的结果都一样 指哪两者啊
2012-04-15 22:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呃,我指的是从小到大和从大到小之两者

重剑无锋,大巧不工
2012-04-15 23:25
快速回复:GCC编译器是如何计算结构体的大小的啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064959 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved