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
实例,就可以为现在存在的每个成员向量保留内存。