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)
自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的方法.
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |