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/