2

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

这是我的情况:

目前我有这个:

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

4 回答 4

5

比内置类型大的对象通常通过引用传递比通过值传递更便宜。因此,如果您的对象大约 3 Meg 大,并且您需要传递它,请不要复制它!

所有 STL 类型都使用值语义:它们复制其内容。请注意,可能存在指针的内容。在这种情况下,指针被复制,而不是它们所指的内容。

通过引用传递您的图像列表甚至可能是一个好主意。节省了大量的智能指针复制,因此节省了大量的引用计数管理,并且可能节省了大量的锁定/解锁。

于 2009-07-10T17:19:40.183 回答
3

我认为boost::shared_ptr路由是一个好方法,只要在Image复制列表时不复制 s 并不重要。您将最小化复制,但当最后一个列表被销毁时,引用计数也会为您清理内容。

于 2009-07-10T17:20:36.143 回答
2

不要查看 Boost指针容器。复制 boost::shared_ptr 很便宜,但并不便宜。参考计数也不是免费的。如果您要进行大量复制并且不需要共享单个 Image 对象,那么 Boost 指针容器是更好的选择。

于 2009-07-10T18:15:21.960 回答
1

首先,我会

typedef std::list<Image> ImageList;

如果您只需要处理一个列表,操作它,将引用传递给 ImageList 本身。不需要那样复制任何东西。如果您需要保留原始列表并对其进行复制,boost::shared_ptr 是要走的路。

于 2009-07-10T17:26:01.403 回答