读书人

结构体嵌套字节对齐为什么会这样,该

发布时间: 2012-02-07 17:45:36 作者: rapoo

结构体嵌套,字节对齐为什么会这样
struct MyStruct
{
char dda;
struct{
char dda11;
char dda12;

} d;
char type;
};
为什么是4呢?

[解决办法]
还是简单解释一下吧。
struct MyStruct
{
char dda;
struct{
char dda11;
char dda12;

} d;
char type;
};
——这一个,除了char,就没用到过别的类型,而char在VC中是单字节的,可以讲,单字节类型不存在对齐问题。所以它天生就是齐的,不需要再对。

struct D {
char dda11;
char dda12;
char dda13;
char dda14;
} ;
——这个当然也是4

struct MyStruct
{
char dda;
D d;
char type;
};
——这一个尽管包含了一个结构体类型,但那个结构体由于只包含char类型,结果它本身仍然是1字节对齐的,所以是6也就不奇怪了。

struct MyStruct2
{
char dda;
int d;
char type;
};
——这一个,int必须从4的整数倍的地址开始,导致第一个char之后被填充了3个字节,又因为这个struct用到了一个int,导致它本身也必须是按4字节对齐了,于是后一个char之后也被填充了4个字节。

其实,考虑对齐问题,一个简单的思路是,设想一下如果定义一个那种类型的数组(即一个个元素紧挨在一起时),你所认为的方案有没有问题(即会不会导致某些类型不被对齐到相应的边界上,比如会不会发生int不在4的整数倍地址上等等),往往问题就容易想正确了。
[解决办法]
其实弄清这个问题,关键是抓住一点:
1、找出结构体成员中最大一个对齐标准作为对齐标准n bytes;
2、内存布局,对于每一个成员mi,假设当前地址为m(初始m值如何对齐的与cpu有关)
如果是非结构成员,则按照如下规则
*如果n-m%n > = sizeof(mi),那么mi的起始地址为m,同时更新m=m+sizeof(mi+(mi%n==0?0:n))
*如果是结构成员,按照先声明后使用的规则,必然已知其大小,并且已使用本规则得出内存布局和大小,所以可看作非结构成员处理。
有兴趣的朋友可测试一下。

读书人网 >C语言

热点推荐