c++ - std::vector 如何分配对象?

标签 c++ vector std allocator

std::vector 如何分配对象?它看起来好像只是使用 std::allocator::allocate 来创建内存块,但从不调用 std::allocate::construct。这是真的? std::vector 是否仅分配内存而从不将对象构造为内存分配?

如果没有默认构造函数怎么办?当对象没有默认构造函数时,如何调用构造函数?如果有多个参数怎么办?

例如,对于这段代码,没有默认构造函数,而 std::allocator 允许它。

#include <vector>
using namespace std;

class A{
protected:
    int m;
public:
    explicit A(int a) : m(a) { }
};

int main(){
    vector<A> test;
    return 0;
}

最佳答案

自 C++11 以来,这已经发生了相当大的变化。

在 C++03 中,construct只能就地执行复制构造。

但是,请注意 std::vector特别是对象数组,但有不同的大小和容量。也就是说,在包含有用数据的数组部分末尾之外可以有更多元素。

这就是标准库的分配器将“构造”和“内存分配”分开的原因。 allocator两者都做,但不同时。这允许 std::vector分配比它使用更多的内存。当你添加新元素时,它不一定要分配更多内存;它可以通过调用 allocator::construct 来使用剩余的备用内存.

另外,请注意所有将元素添加到 std::vector 的 C++03 函数以一个元素作为参数。 push_back , insert ,甚至是 sized constructor takes as a value as an argument .是的,它是一个默认参数,但它仍然以一个值作为一个元素。使用分配器的 construct 调用将此元素复制到 vector 中获取拷贝的方法。

在 C++11 中,标准容器需要使用 allocator_traits<>::construct功能。这是一个 varadic 函数,它将其参数转发给实际构造。此特征函数将(默认情况下。它可以专门化)调用 allocator::construct方法,如果该调用格式正确。如果不是,它将尝试放置 new .

这允许新的 emplace函数工作。

但是,是的,标准库容器中包含的对象实际上是构造对象。即使分配器的 construct方法未被调用。

关于c++ - std::vector 如何分配对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341184/

相关文章:

c++ - 等于指针值正在改变指针引用

c++ - 如何对 std::vector 实现自己的功能?

c++ - 使用std::sort时如何理解此结果?

c++ - 将数据从 std::vector 写入文本文件的快速方法

c++ - vector 没有正确删除内容(无限量地运行复制赋值运算符直到崩溃 [BEX])?

c++ - 如何从文本文件中提取扩展名为 .txt 的文件名?

c++ - 带有透明客户区的窗口

matlab - 从具有特定索引的向量创建矩阵,无需循环

python - 为什么变量的值在作为列表附加到 python 列表时会发生变化?

c++ - std::vector 的前地址是否移动不变?