人们通常如何管理复制大型对象列表?
这是我的情况:
目前我有这个:
typedef std::vector<float> Image;
我将它存储在
中std::list<Image> lst;
Image.size()非常大(每个大约3-5 MB)。
我正在传递(复制)列表。
我是否正确理解std :: vector将按值复制每个元素?如果是这样,由于过度复制,性能可能有点糟糕?
我可以做些什么来减少复制?我应该存储
std::list<ImageRef> lst;
,其中
typedef boost::shared_ptr<Image> ImageRef;
?
处理这类问题的优雅方法是什么?
答案 0 :(得分:5)
大于内置类型的对象通常通过引用然后按值传递更便宜。所以如果你的物体大约3兆,你需要传递它,请不要复制它!
所有STL类型都使用值语义:它们复制其内容。请注意,内容可能存在指针。在这种情况下,指针被复制,而不是它们所指的。
通过引用传递图像列表甚至可能是个好主意。节省了大量的智能指针复制,因此它节省了大量的引用计数管理,并且可以节省大量的锁定/解锁。
答案 1 :(得分:3)
我认为boost::shared_ptr
路由是一种很好的方法,只要在复制列表时不会复制Image
并不重要。您将最小化复制,但引用计数也将在最后一个列表被销毁时为您清理。
答案 2 :(得分:2)
不要去看看Boost pointer container。复制boost :: shared_ptr很便宜但不便宜。引用计数也不是免费的。如果您正在进行大量复制并且不需要共享单个Image对象,那么Boost指针容器是更好的方法。
答案 3 :(得分:1)
首先,我会
typedef std::list<Image> ImageList;
如果您只需要处理一个列表,操作它,则将引用传递给ImageList本身。无需复制任何方式。如果您需要保留原始列表并复制它,可以使用boost :: shared_ptr。