如何在代码中应用填充?

时间:2014-02-06 08:28:28

标签: c structure padding

我从维基百科阅读以下代码

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

我无法理解上述代码中每个数据成员之后如何应用填充?

2 个答案:

答案 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 packinghere, sizeof != sum (fields)