| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 616 人关注过本帖, 1 人收藏
标题:[讨论]关于结构体字节对齐问题,高手们进来探讨一下
只看楼主 加入收藏
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:3 
[讨论]关于结构体字节对齐问题,高手们进来探讨一下
struct test
{ int m1;char m2;float m3;
union uu{char u[5];int u2[2];}ua;
}myaa;

运行sizeof(struct test),在TC中的运行结果是12,在VC++中的运行结果是20,网上有人说VC++是4字节对齐,所以就是4+1+3(空字节)+4+8=20。

但是本人在百度百科中查了下字节对齐的内容:

 


实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

 

       1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;


 
  2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

 
  3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。例如上面第一个结构体变量。

从以上例子看,VC++明显不满足二三条件,求高手解释一下。

还有TC中为什么字节数是成员所占字节数简单相加呢,求解答,是否TC字节对齐数是1啊,或是不进行字节对齐的

搜索更多相关主题的帖子: 结构体 字节 探讨 
2010-08-25 14:10
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:10 
字节对齐是为了提供CPU读取能力,如果字节不对齐,CPU读一个数据,很可能要2个周期,浪费CPU时间,如果在以前的机器上 字节不对齐的话  系统要报总线错误  估计现在的计算机不会出现这个问题了
2010-08-25 14:44
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:10 
TC是简单相加吗?在你这个例子里,显示不是这样的
另外,VC明显不满足二三条件?我没看出

实验代码用这段吧:

#include <stdio.h>

typedef struct tests
{ int m1;char m2;float m3;
union uu{char u[5];int u2[2];}ua;
}tests;

int main()
{
    tests a;
    printf("%d\n%d %d %d", sizeof(tests), (int)&a.m2 - (int)&a.m1, (int)&a.m3 - (int)&a.m2, (int)&a.ua - (int)&a.m3);
    return 0;
}

御坂回答

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-25 15:37
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
没一个回答得好的,还有楼上的,我想问你,20是8的倍数吗
2010-08-25 18:58
快速回复:[讨论]关于结构体字节对齐问题,高手们进来探讨一下
数据加载中...
 
   



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

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