我从维基百科阅读以下代码
struct MixedData
{
char Data1;
short Data2;
int Data3;
char Data4;
}md;
printf("%u %u %u %u", &md.Data1, &md.Data2, &md.Data3, &md.Data4);
输出结果为: -
268624 268626 268628 268632
我无法理解上述代码中每个数据成员之后如何应用填充?
答案 0 :(得分:1)
来自here
第一个元素是char,它是一个字节对齐的,后跟short INT。 short int是2字节对齐的。如果short int元素是 在char元素之后立即分配,它将以奇数开始 地址边界。编译器将在之后插入填充字节 确保短int的char将具有2的地址倍数(即2 字节对齐)。
这就是你的结构的样子:
+-------+-------+-------+-------+
| Data1 | | Data2 |
+-------+-------+-------+-------+
| Data3 |
+-------+-------+-------+-------+
| Data4 | | | |
+-------+-------+-------+-------+
因此,从char到short
的填充是一个字节=>
268624至268625是Data1,从268625到268626填充到short
。
然后268626到268628 short
不需要填充,全部与结构的最大类型对齐。
来自同一参考
有一种方法可以最小化填充。程序员应该声明 结构成员按其大小的递增/递减顺序
改进结构的方法是在char Data4;
之后直接放置char Data1;
这样就不会浪费内存来填充:
struct MixedData
{
char Data1;
char Data4;
short Data2;
int Data3;
}md;
printf("%p %p %p %p", &md.Data1,&md.Data4, &md.Data2, &md.Data3);
0x602270 0x602271 0x602272 0x602274
基本假设,编译器坚持使用x86上的int的自然对齐
答案 1 :(得分:0)
如何?
1个字节的2个字节char
2字节短2字节
4字节int 4个字节
? 1字节字符的字节
真正的问题是:为什么?
该问题的答案是here, structure padding and packing和here, sizeof != sum (fields)