Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector如何分配对象?_C++_Vector_Std_Allocator - Fatal编程技术网

C++ std::vector如何分配对象?

C++ std::vector如何分配对象?,c++,vector,std,allocator,C++,Vector,Std,Allocator,std::vector如何分配对象?它似乎只是使用std::allocator::allocate来创建内存块,但从不调用std::allocate::construct。这是真的吗?std::vector是否只分配内存而从不将对象构造为内存分配 如果没有默认构造函数怎么办?当对象上没有默认构造函数时,如何调用构造函数?如果有多个参数,该怎么办 例如,此代码没有默认构造函数,std::allocator允许它 #include <vector> using namespace std

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;
}
#包括
使用名称空间std;
甲级{
受保护的:
int m;
公众:
显式A(inta):m(A){}
};
int main(){
病媒试验;
返回0;
}

它依赖于实现,但典型的实现使用
std::allocator::allocate
分配内存块,然后使用新的位置通过复制构造函数(或C++11中的移动构造函数)构造实例


当元素被擦除时,它们的析构函数被直接调用以销毁对象,即使底层内存没有被释放。

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

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

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

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

另外,请注意,所有向
std::vector
添加元素的C++03函数都将元素作为参数<代码>向后推,
插入
,甚至是。是的,它是一个默认参数,但它仍然将值作为元素。该元素通过调用分配器的
构造
方法复制到向量中

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

这允许新的
安放
功能工作


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

Copy和move构造函数与放置new无关。如果没有默认构造函数怎么办?当对象上没有默认构造函数时,如何调用构造函数?如果有多个参数怎么办?@Nicol:我指的是
std::vector
在构造操作符时倾向于使用所讨论类的复制(或移动)构造函数。由于placement new仍然调用构造函数(就像non placement new一样),这就是我的意图。。。如果该参数是同一类型的对象呢。您好,复制构造函数的时间到了。@Prætorian:您能提供这个的源代码吗?我刚才在问题上的代码显示它将在VS2010中编译,我相信它也会在gcc中编译standard@Prætorian:这是一条新的C++11规则还是在C++03中?@Prætorian:你能提供你在哪里找到它的来源吗?我好像找不到那个。上面的代码也编译好,只是一个例子。@ CHADB:源代码是C++语言的标准,如2011发布的。然而,他的一个理由是错误的:
std::vector
本身并不要求
T
是默认可构造的。不是在C++11或C++03中。但是,在不提供第二个参数(要复制到数组中的对象)的情况下,调用采用大小的
vector
构造函数确实要求它是默认可构造的。在C++03中,这是因为它将默认构造另一个参数。在C++11中,这是因为它将默认地就地构造元素。