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

C++ 如何强制reserve()使用非默认构造函数?,c++,c++11,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); // m

假设我们有以下代码段:

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();//MyType.aMember的大小是默认大小
MyType::MyType(int mySize);//MyType.aMember的大小取决于mySize
...
...
std::vector myTypeVector;
myTypeVector.reserve(numberOfObjects);//保留的内存为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))
...
MyType::MyType();//MyType.aMember的大小是默认大小
MyType::MyType(int mySize);//MyType.aMember的大小取决于mySize
...
...
std::vector myTypeVector(numberOfObjects,MyType(desiredSize));//分配的内存是numberOfObjects*sizeof(MyType(desiredSize))
...

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

一种类型只能有一个大小。调用非默认构造函数对对象的大小没有影响。因此,不需要你所要求的<代码>保留不使用也不能使用构造函数来确定对象的大小

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

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


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

为什么需要一个构造函数来知道大小,难道
sizeof
不够吗?
reserve
不应该使用默认构造函数,因为它不构造任何东西,所以它只是分配。
reserve()
无论如何也不构造任何项目,而是保留空间。MyType的
大小取决于mySize。aMember是不可能的,所以这个问题没有意义。我想你误解了什么<代码>MyType
无法更改其大小。它就是不能。也许您在
MyType
中有一个指针或容器,它根据
mySize
分配内存,但这不会改变
MyType
的大小。另外,
reserve
不调用任何构造函数,它只是分配内存。如果我的问题没有明确说明我的需要,那么很抱歉:我想保留足够的内存来容纳所需数量的对象,每个对象都一样,但都有自己特定的内存需求。你能重新表述一下吗?你的意思是想在向量中存储不同类型的对象吗?@ChandraMouli:
reserve()
只保留一块足够容纳N个对象的内存。它不会在内存中构造任何对象。您需要使用
push…()
resize()
方法来执行此操作。因此,无论为
MyType
定义什么构造函数,
reserve()
都不会调用任何构造函数。对象成员的内存需求与
reserve()
无关。我可能使用了错误的模式,但我想做的是:为对象向量保留空间,其中每个对象都是相同类型的,但碰巧是另一个向量的成员为其自身保留了特定的所需空间。啊,现在这一点变得更清楚了。不能为尚不存在的向量保留空间。您只能保留内存
myTypeVector
,一旦构建了
MyType
实例,就可以为现在存在的每个成员向量保留内存。