假设我们有以下代码段:
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))
...
但是上面调用了复制构造函数,出于效率原因我想避免使用它。因此我的问题。
答案 0 :(得分:0)
一种类型只能有一种尺寸。调用非默认构造函数对对象的大小没有影响。因此,您无需提出要求。 reserve
不会也不能使用构造函数来确定对象的大小。
您的尝试std::vector<MyType> myTypeVector(numberOfObjects, MyType(desiredSize));
完全不同。它构造临时numberOfObjects
对象的 MyType
个数字副本,因此必须复制。如果您只想为这些对象保留空间,那么myTypeVector.reserve(numberOfObjects);
将准确分配正确的内存量。
向量本身不包含对象。如果是这样,它永远不会改变大小。相反,vector包含指向缓冲区的指针,该缓冲区是单独分配的。因此,向量的容量或对象计数对向量对象本身的大小没有影响,因此它们也不会影响包含向量成员的对象的大小。
对于不存在的向量缓冲区,您不能reserve
内存。正如我所说,myTypeVector.reserve(numberOfObjects);
足以为MyType
个实例分配内存,一旦构造了实例,就可以为成员向量保留空间。