C ++在std :: list<>中存储大数据..我应该使用引用计数?

时间:2009-07-10 17:15:47

标签: c++ reference-counting stdlist

人们通常如何管理复制大型对象列表?

这是我的情况:

目前我有这个:

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;

处理这类问题的优雅方法是什么?

4 个答案:

答案 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。