我有这样一个类:
class MyClass{
public:
shared_ptr<X> a;
shared_ptr<Y> b;
std::string c;
std::vector<double> d;
std::vector<shared_ptr<Z>> e;
int f;
};
当我在VS2012上编译时,切换到查看类布局,我得到这个:
1> class MyClass size(128):
1> +---
1> 0 | {vfptr}
1> 8 | ?$shared_ptr@VX@@ a
1> 24 | ?$shared_ptr@VY@@ 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@Z@@@boost@@V?$allocator@V?$shared_ptr@VZ@@@boost@@@std@@ e
1> 120 | f
1> | <alignment member> (size=4)
1> +---
表示数据成员c
为32字节。
然而,如果我在我的平台(win7 64)上执行sizeof(std::string)
,使用MSVC11,我得到40字节。
为什么sizeof()
给我40,但上面的编译器内存布局暗示32?
数据成员c可能是指向string对象的指针。由于std::string存储的是可变大小的字符串,因此无法在该空间中放入任何您想要的内容。
所以它是一个指针,由语言管理,而不是由你管理。