sizeof()与编译器布局开关的大小不一样?

时间:2015-02-22 17:45:56

标签: c++ class visual-c++ struct sizeof

我使用Microsoft C ++编译器(2012)和-d1reportallclasslayout开关来显示类布局。这是我的班级:

class O{
    shared_ptr<A> a;
    shared_ptr<B> b;
    std::string c;
    std::vector<double> d;
    std::vector<X> e;
    int f;
};

class Y : public O{
    int g;
};

当我使用-d1reportallclasslayout时,它会给我以下内容:

1>  class Y size(136):
1>      +---
1>      | +--- (base class O)
1>   0  | | {vfptr}
1>   8  | | ?$shared_ptr@VA@@ a
1>  24  | | ?$shared_ptr@VB@@ b
1>  40  | | ?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@ c
1>  72  | | ?$vector@NV?$allocator@N@std@@ d
1>  96  | | ?$vector@V?$shared_ptr@VX@@@boost@@V?$allocator@V?$shared_ptr@VX@@@boost@@@std@@ e
1>  120 | | f
1>      | | <alignment member> (size=4)
1>      | +---
1>  128 | g
1>      +---

所以上面说的向量de都是24字节(96-72和120-96)。但是,当我使用sizeof()时(在调试模式下),我为每个向量得到32:

std::cout << sizeof(my_Y_instance->d) << std::endl;
std::cout << sizeof(my_Y_instance->e) << std::endl;

我知道vector有三个指针类成员(因此是24个字节) - 但我不明白sizeof()是否包含填充,为什么不显示这个填充的类布局?

现在我真的不知道它是否占据了对象的24或32个字节?

1 个答案:

答案 0 :(得分:1)

我的猜测是,您将调试运行时用于一个输出,而将发布运行时用于另一个输出。

std::cout << sizeof(std::vector<int>) << endl;

输出24用于x64 / release,32用于x64 / debug。