c ++中的数据结构填充是什么?如何检查填充字节的字节数?
class a { public: int x; int y; int z; };
答案 0 :(得分:4)
处理器要求某些类型的数据具有特定的对齐方式。例如,处理器可能要求int
在4字节边界上。因此,例如,int
可以从内存位置0x4000
开始,但无法从0x4001
开始。所以如果你定义了一个类:
class a
{
public:
char c;
int i;
};
编译器必须在c
和i
之间插入填充,以便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建议的那样手动计算。