对于C++非菜鸟来说这可能是显而易见的,但它让我感到有些不满 - 一个类的字符串成员是否在该类中分配了可变数量的空间?或者只是在内部为内存中的其他空间分配一个指针?例如,在这个例子中:
class Parent {
public:
vector<Child> Children;
}
class Child {
public:
string Name;
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个"new Parent()"并添加一些具有不同长度字符串的子节点,那么如何在堆上分配?父4字节,子4字节(或指针大小,加上固定大小的内部数据),然后在堆上的其他地方随机堆一串字符串?或者它是否都在内存中捆绑在一起?
我猜一般来说,容器类型本身总是固定大小,只包含指向其可变大小数据的指针,并且这些数据总是在堆上吗?
C++中的类总是固定大小.当存在可变大小的组件时,例如,向量的元素或字符串中的字符,它们可以在堆上分配(对于小字符串,它们也可以嵌入到字符串本身中;这被称为小字符串优化).也就是说,你的Parent对象将包含std::vector<Child>其中的Child对象在堆上分配(该std::vector<...>对象本身可能保持三个字其数据,但有几种方法事情可能进行布局).将std::string在对象Child分配自己的记忆.也就是说,可能存在相当多的内存分配.
C++ 2011标准彻底定义了分配器,以支持将分配机制传递给对象及其所有子对象.当然,这些类也需要支持这种机制.如果你的Parent和Child类有合适的构造函数来获取分配器并将这个分配器传递给所有进行分配的成员,它将通过系统传播.这样,属于一起的对象的分配可以被布置成合理地靠近.
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |