gpt4 book ai didi

c++ - 按值将项目插入 vector 与 unique_ptr

转载 作者:行者123 更新时间:2023-11-30 05:04:30 29 4
gpt4 key购买 nike

我想知道这两种 vector 声明在性能和内存消耗方面有何不同。

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

我进退两难,因为我必须在 vector 中创建一些观察者,如果我在初始化时这样做,我必须使用 unique_ptrs,因为 vector 的大小可变。我不想使用 shared_ptr,因为它们有很大的内存开销。

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

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

或者,如果创建 vectorB 而不是 vectorA 更好。然后我就可以在初始化时创建观察者,因为 unique_ptr 指向的位置不会改变。我想在这种情况下,我每件元素至少会损失 4B/8B。

最佳实践怎么说?我是 C++ 的初学者,我是第一次解决这样的问题。

最佳答案

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

该方法的优点是:

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

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

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

关于c++ - 按值将项目插入 vector 与 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48842393/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com