我使用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> +---
所以上面说的向量d
和e
都是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个字节?
答案 0 :(得分:1)
我的猜测是,您将调试运行时用于一个输出,而将发布运行时用于另一个输出。
std::cout << sizeof(std::vector<int>) << endl;
输出24用于x64 / release,32用于x64 / debug。