gpt4 book ai didi

c++ - push_back 对象到 vector 内存问题 C++

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:42 31 4
gpt4 key购买 nike

这里比较两种初始化对象vector的方式。

1.
vector<Obj> someVector;
Obj new_obj;
someVector.push_back(new_obj);

2.
vector<Obj*> ptrVector;
Obj* objptr = new Obj();
ptrVector.push_back(objptr);

第一个push_back 实际对象而不是对象的指针。 vector push_back 是否复制被推送的值?我的问题是,我有很大的对象和很长的 vector ,所以我需要找到一种节省内存的最佳方法。

  • 第二种方式更好吗?
  • 是否有其他方法可以获得一个对象/指针 vector ,我可以稍后找到每个对象并同时使用最少的内存?

最佳答案

在上述两个选项中,第三个未包含的选项是最有效的:

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* 的接口(interface)时。

这两种解决方案都需要 C++11。如果您缺少 C++11,并且对象确实很大,那么“数据指针 vector ”是可以接受的。

无论如何,您真正应该做的是确定哪个最适合您的模型,检查性能,只有在存在实际性能问题时才进行优化。

关于c++ - push_back 对象到 vector 内存问题 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18995369/

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