如何强制reserve()使用非默认构造函数?

时间:2015-04-22 15:56:22

标签: c++ c++11

假设我们有以下代码段:

MyType::MyType();            // size of MyType.aMember is a default size
MyType::MyType(int mySize);  // size of MyType.aMember depends on mySize
...
...
std::vector<MyType> myTypeVector;
myTypeVector.reserve(numberOfObjects);  // memory reserved is numberOfObjects * sizeof(MyType)
...

如何使保留不使用默认构造函数来确定单个对象的大小,而是使用所需的构造函数?

可以尝试以下方法:

MyType::MyType();            // size of MyType.aMember is a default size
MyType::MyType(int mySize);  // size of MyType.aMember depends on mySize
...
...
std::vector<MyType> myTypeVector(numberOfObjects, MyType(desiredSize));  // memory allocated is numberOfObjects * sizeof(MyType(desiredSize))
...

但是上面调用了复制构造函数,出于效率原因我想避免使用它。因此我的问题。

1 个答案:

答案 0 :(得分:0)

一种类型只能有一种尺寸。调用非默认构造函数对对象的大小没有影响。因此,您无需提出要求。 reserve不会也不能使用构造函数来确定对象的大小。

您的尝试std::vector<MyType> myTypeVector(numberOfObjects, MyType(desiredSize));完全不同。它构造临时numberOfObjects对象的 MyType个数字副本,因此必须复制。如果您只想为这些对象保留空间,那么myTypeVector.reserve(numberOfObjects);将准确分配正确的内存量。

向量本身不包含对象。如果是这样,它永远不会改变大小。相反,vector包含指向缓冲区的指针,该缓冲区是单独分配的。因此,向量的容量或对象计数对向量对象本身的大小没有影响,因此它们也不会影响包含向量成员的对象的大小。

对于不存在的向量缓冲区,您不能reserve内存。正如我所说,myTypeVector.reserve(numberOfObjects);足以为MyType个实例分配内存,一旦构造了实例,就可以为成员向量保留空间。