人们通常如何管理周围的大型对象列表的复制?
这是我的情况:
目前我有这个:
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;
?
处理此类问题的优雅方法是什么?
最佳答案
比内置类型大的对象通过引用然后按值传递的方式通常更便宜。因此,如果您的物体大约3兆欧,并且需要传递,请不要复制它!
所有STL类型都使用值语义:它们复制其内容。注意,内容可能存在指针。在这种情况下,将复制指针,而不是它们所指的指针。
通过引用传递图像列表甚至是一个好主意。节省了大量的智能指针复制,因此节省了大量的引用计数管理,并且可以节省大量的锁定/解锁。