std :: vector如何分配对象?

cha*_*adb 3 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;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 8

自C++ 11以来,这已经发生了很大变化.

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

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

这就是标准库的分配器在"构造"和"内存分配"之间存在分离的原因.该allocator不会都做,但不是在同一时间.这允许std::vector分配比它使用的更多的内存.添加新元素时,不一定要分配更多内存; 它可以通过调用使用它留下的备用内存allocator::construct.

另请注意,所有C++ 03函数都添加元素以std::vector 将元素作为参数.push_back,insert即使是大小的构造函数也将值作为参数.是的,它是一个默认参数,但它仍然需要一个值作为元素.使用对分配器的方法的调用将该元素复制到向量中,该construct方法获取副本.

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

这允许新emplace功能起作用.

但是,标准库容器中包含的对象实际上是构造对象.即使construct没有调用allocator的方法.