按值将项目插入向量与 unique_ptr
Inserting items to vector by value vs unique_ptr
我想知道这两个 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++ 的初学者,我是第一次解决这样的问题。
如果可能的话,我会选择std::vector<MyType>
。
该方法的优点是:
- 包含所有元素的单个内存块,因此遍历它会更好,因为预取器可以更好地工作
- 更少的内存分配,因为 new/delete 是昂贵的方法
- 更少的内存开销(但是,每个元素 1 个额外的指针能做那么多吗?您可以通过命令您的成员减少填充来实现这一点)
- 指向元素的指针在您重新分配之前是稳定的(因此如果您从不 push_back 保留超过保留的大小,那么在前面保留正确的大小可以提供稳定的指针)
但是,使用 std::vector<std::unique_ptr<MyType>>
解决了一些负面因素:
- 可以与抽象的 MyType 一起使用 class(或接口)
- Move/copy class 的构造函数将不会被调用(这可能很昂贵或 non-existent)
- 它将允许您保留指向 MyType 的原始指针
我想知道这两个 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++ 的初学者,我是第一次解决这样的问题。
如果可能的话,我会选择std::vector<MyType>
。
该方法的优点是:
- 包含所有元素的单个内存块,因此遍历它会更好,因为预取器可以更好地工作
- 更少的内存分配,因为 new/delete 是昂贵的方法
- 更少的内存开销(但是,每个元素 1 个额外的指针能做那么多吗?您可以通过命令您的成员减少填充来实现这一点)
- 指向元素的指针在您重新分配之前是稳定的(因此如果您从不 push_back 保留超过保留的大小,那么在前面保留正确的大小可以提供稳定的指针)
但是,使用 std::vector<std::unique_ptr<MyType>>
解决了一些负面因素:
- 可以与抽象的 MyType 一起使用 class(或接口)
- Move/copy class 的构造函数将不会被调用(这可能很昂贵或 non-existent)
- 它将允许您保留指向 MyType 的原始指针