如何计算对象中存储的字节数

时间:2015-02-22 05:53:07

标签: c++

假设我有以下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 

2 个答案:

答案 0 :(得分:2)

您正在看到编译器添加的其他“不可见”填充字节的证据(在本例中,在您的类的末尾)以实现对齐。

编译器喜欢在方便(例如64位,或8字节,在您的情况下)边界上对齐结构,以便更有效地访问其成员。在这种情况下,如果要创建多个Foo对象的数组,则情况确实如此;结束填充将使每个开头保持在8字节(64位)边界上。如果您在此类中有不同大小的字段,您可能还会在字段之间看到用于相同目的的其他填充。

答案 1 :(得分:1)

编译器可以添加填充来对齐单词,这可能就是它的来源。您可以使用#pragma pack尝试消除它,但我不确定它是否可靠