按值和unique_ptr将项目插入向量

时间:2018-02-17 14:32:35

标签: c++ vector smart-pointers

我想知道这两个vector的声明在性能和内存消耗方面有什么不同。

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 ++的初学者,我第一次解决了这个问题。

1 个答案:

答案 0 :(得分:1)

如果可能的话,我会选择std::vector<MyType>

该方法的优点是:

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

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

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