数据结构填充

时间:2011-05-17 01:19:45

标签: c++ data-structures

c ++中的数据结构填充是什么?如何检查填充字节的字节数?

class a { public: int x; int y; int z; };

4 个答案:

答案 0 :(得分:4)

处理器要求某些类型的数据具有特定的对齐方式。例如,处理器可能要求int在4字节边界上。因此,例如,int可以从内存位置0x4000开始,但无法从0x4001开始。所以如果你定义了一个类:

class a
{
public:
    char c;
    int i;
};

编译器必须在ci之间插入填充,以便i可以在4字节边界上开始。

答案 1 :(得分:2)

struct A
{
    char c;
    int i;
};

int main(int argc, char *argv[])
{
    A a;

    cout << "sizeof struct = " << sizeof(A) << endl;

    cout << "sizeof items  = " << sizeof(a.c) + sizeof(a.i) << endl;

    return 0;
}

答案 2 :(得分:0)

填充是出于性能原因而完成的 - 有关详细信息,请参阅此文章Data Structure Alignment

要查看编译器是否填充了您的数据结构,您可以编写一个简单的程序:

#include <iostream>

class a {
public:
    int x;
    int y;
    int z;
};

int main()
{
    std::cout << sizeof(a) << std::endl; // print the total size in bytes required per class instance

    a anInstance;
    std::cout << &anInstance.x << std::endl; // print the address of the x member
    std::cout << &anInstance.y << std::endl; // as above but for y
    std::cout << &anInstance.z << std::endl; // etc
}

我添加了公共声明以避免编译错误 - 它不会影响大小或填充。

编辑:在我的macbook air上运行它会给出以下输出:     12     0x7fff5fbff650     0x7fff5fbff654     0x7fff5fbff658

这表明在我的机器上总大小为12个字节,每个成员相隔4个字节。整数是每个4个字节(可以用sizeof(int)确认)。没有填充物。

尝试使用您班级中的不同成员,例如:

class b {
    public:
        char      w;
        char      x[6];
        int       y;
        long long z;
};

答案 3 :(得分:0)

Lol只需创建两个相同的结构,使其中一个包装好 e.g。

struct foo {
  int  a;
  char b;
  int  c;
} 

struct bar {
  int  a;
  char b;
  int  c;
} __attribute__((__packed__));

sizeof(foo) - sizeof(bar) 会给你填充量。或者您也可以像Duck建议的那样手动计算。