按值将项目插入向量vs unique_ptr

加速

我想知道这两个向量声明之间在性能和内存消耗上有什么区别。

class MyType;
std::vector<MyType> vectorA;
std::vector<std::unique_ptr<MyType>> vectorB;

我有一个难题,因为我必须在向量中创建一些观察者,并且如果在初始化时执行此操作,则由于向量的可变大小,必须使用unique_ptrs。我不想使用shared_ptrs,因为它们有很大的内存开销。

我正在寻找性能和内存消耗之间的最佳平衡。

我需要知道最好先初始化vectorA(初始化后严格不变),然后在该向量中创建观察者(它不会更改其内容,所以我可以这样做)。在这种情况下,我将失去一些性能。

或者,最好创建vectorB而不是vectorA。然后,我将能够在初始化时创建观察者,因为unique_ptr指向的位置不会更改。我想在这种情况下,每件物品我至少会丢失4B / 8B。

最佳做法怎么说?我是C ++的初学者,并且是第一次解决此类问题。

JVApen

如果可能的话,我会同意的std::vector<MyType>

该方法的优点是:

  • 包含所有元素的单个内存块,因此循环循环会更好,因为预取器可以更好地工作
  • 较少的内存分配,因为新/删除是昂贵的方法
  • 更少的内存开销(但是,每个元素1个额外的指针能做那么多吗?您可以通过命令成员减少填充来获得此效果)
  • 指向元素的指针在您重新分配之前是稳定的(因此,如果您从来没有push_back超过保留值,则以正确的大小保留在前面可以提供稳定的指针)

但是,使用std::vector<std::unique_ptr<MyType>>可以解决一些负面因素:

  • 可以与MyType作为抽象类(或接口)一起使用
  • 该类的移动/复制构造函数将不会被调用(可能昂贵或不存在)
  • 它将允许您保留指向MyType的原始指针

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章