这对于 C++ 非菜鸟来说可能是显而易见的,但它让我有点难过——一个类的字符串成员是否在该类中分配了可变数量的空间?或者它只是在内部分配一个指向内存中其他空间的指针?例如。在这个例子中:
class Parent {
public:
vector<Child> Children;
}
class Child {
public:
string Name;
}
如果我创建一个“new Parent()”并添加一些具有不同长度字符串的子项,它是如何在堆上分配的? Parent 是 4 个字节,Child 是 4 个字节(或者任何指针大小,加上固定大小的内部数据),然后是堆上其他地方的随机字符串堆?还是全部捆绑在内存中?
我想一般来说,容器类型本身总是固定大小,只包含指向其可变大小数据的指针吗?这些数据是否总是在堆上?
最佳答案
C++ 中的类总是固定大小的。当存在可变大小的组件时,例如 vector 的元素或字符串中的字符,它们可以分配在堆上(对于小字符串,它们也可以嵌入到字符串本身中;这称为 小字符串优化)。也就是你的Parent
对象将包含 std::vector<Child>
Child
在哪里对象在堆上分配(std::vector<...>
对象本身可能为其数据保留三个字,但有多种布局方式)。 std::string
Child
中的对象自己分配内存。也就是说,可能有相当多的内存分配。
C++ 2011 标准彻底定义了分配器,以支持将分配机制传递给对象及其所有子对象。当然,类也需要支持这种机制。如果你的Parent
和 Child
类有合适的构造函数采用分配器,并将该分配器传递给所有进行分配的成员,它将通过系统传播。这样,属于一起的对象的分配可以安排得相当接近。
关于C++ 字符串/容器分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148715/