假设我有以下Foo类。 Foo的成员变量的大小是我所期望的。但是,Foo它的自身大小是16.额外的四个字节来自哪里?
#include <iostream>
#include <string>
using namespace std;
class Foo {
public:
int *data;
int length;
};
int main() {
Foo f;
cout << "Size of foo's data: " << sizeof(f.data) << endl;
cout << "Size of foo's length: " << sizeof(f.length) << endl;
cout << "Size of foo: " << sizeof(f) << endl;
return 0;
}
输出:
Size of foo's data: 8
Size of foo's length: 4
Size of foo: 16
答案 0 :(得分:2)
您正在看到编译器添加的其他“不可见”填充字节的证据(在本例中,在您的类的末尾)以实现对齐。
编译器喜欢在方便(例如64位,或8字节,在您的情况下)边界上对齐结构,以便更有效地访问其成员。在这种情况下,如果要创建多个Foo
对象的数组,则情况确实如此;结束填充将使每个开头保持在8字节(64位)边界上。如果您在此类中有不同大小的字段,您可能还会在字段之间看到用于相同目的的其他填充。
答案 1 :(得分:1)
编译器可以添加填充来对齐单词,这可能就是它的来源。您可以使用#pragma pack尝试消除它,但我不确定它是否可靠