在上述两个选项中,不包括的第三种是最有效的:
std::vector<Obj> someVector;
someVector.reserve(preCalculatedSize);
for (int i = 0; i < preCalculatedSize; ++i)
someVector.emplace_back();
emplace_back
直接将对象构造到vector
为其安排的内存中。如果您reserve
事先使用,可以避免重新分配和移动。
但是,如果对象真的很大,那么缓存一致性的优势就更少了。所以一个vector
智能指针是有意义的。因此第四个选项:
std::vector< std::unique_ptr<Obj> > someVector;
std::unique_ptr<Obj> element( new Obj );
someVector.push_back( std::move(element) );
可能是最好的。在这里,我们表示数据的生命周期以及如何以几乎为零的开销在同一结构中访问它,从而防止它不同步。
当你想移动它时,你必须明确地std::move
环绕它。std::unique_ptr
如果您出于某种原因需要原始指针,.get()
那么如何访问它。 ->
和*
和explicit operator bool
都被覆盖了,所以你只需要.get()
在你有一个需要Obj*
.
这两种解决方案都需要 C++11。如果您缺少 C++11,并且对象确实很大,那么“指向数据的指针向量”是可以接受的。
无论如何,您真正应该做的是确定哪个与您的模型最匹配,检查性能,并且只有在存在实际性能问题时才进行优化。