【发布时间】:2013-01-03 23:04:50
【问题描述】:
这对于 C++ 非菜鸟来说可能是显而易见的,但它让我有点难过 - 一个类的字符串成员是否在该类中分配了可变数量的空间?或者它只是在内部分配一个指向内存中其他空间的指针?例如。在这个例子中:
class Parent {
public:
vector<Child> Children;
}
class Child {
public:
string Name;
}
如果我创建一个“new Parent()”并添加一些具有不同长度字符串的子项,它是如何在堆上分配的?是父 4 字节,子 4 字节(或任何指针大小,加上固定大小的内部数据),然后是堆上其他地方的随机字符串堆?还是全部捆绑在内存中?
我猜一般来说,容器类型本身总是固定大小的,并且只包含指向其可变大小数据的指针,并且这些数据总是在堆上吗?
【问题讨论】:
-
您的最后一点是考虑它的最佳方式,而不涉及他们采用的可选分配器。
-
@chris Cool,谢谢 - 是的,还没有必要使用自定义分配器。
-
如果您使用的是 VS2010 或 VS2012,您可以通过将以下编译器开关添加到项目的附加命令行选项 /d1reportSingleClassLayoutxxx 来了解自己(其中 xxx 是用作与类匹配的子字符串的字符串报告)。感谢 AltDevBlogADay 的 Alex Darby,他指出了这个无证转换。还有另一个未记录的编译器选项,称为 /d1reportAllClassLayout,但它列出了所有类。