C++ 字符串/容器分配

标签 c++ string stl

这对于 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 标准彻底定义了分配器,以支持将分配机制传递给对象及其所有子对象。当然,类也需要支持这种机制。如果你的ParentChild类有合适的构造函数采用分配器,并将该分配器传递给所有进行分配的成员,它将通过系统传播。这样,属于一起的对象的分配可以安排得相当接近。

关于C++ 字符串/容器分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148715/

相关文章:

c++ - 排序 char* 数组

c++ - 在 IOS 中使用 OpenCV

java - 对话框上的 EditText 不返回任何文本

c++ - 在 std::string 中读取整个文件或使用 std::ifstream 操作文件哪个更好?

c++ - 使用 vector Android NDK - Eclipse CDT

c++ - Qt C++ 静态 thread_local QNetworkAccessManager 是线程应用程序的好选择吗?

c++ - (C++) 在没有递归的情况下实现指数函数求值器?

java - 在java中查找字符串的所有大写字母

c++ - 没有用于方法调用的可行的 std::weak_ptr 到 std::shared_ptr 的转换

c++ - std::tr1::unordered_map::operator[] 的时间效率