传递大数据向量的更好方法
Posted
技术标签:
【中文标题】传递大数据向量的更好方法【英文标题】:Better way to pass vector of LargeData 【发布时间】:2013-12-02 19:36:40 【问题描述】:需要设计一个函数来返回一个BigClass的数组。为了防止不必要的复制,我有两种选择。
struct BigClass
int manyfields;
;
boost::shared_ptr<vector<BigClass> > Fun1()
throw;
vector<boost::shared_ptr<BigClass> > Fun2()
throw;
问题> 哪种方法是更好的选择?如果以上都不好,请提供更好的。
谢谢
【问题讨论】:
返回引用不是一种选择吗? (std::vector<BigClass>& func(void);
) :v
可以用c++11移动语义吗?
VS2010 有移动语义 AFAIK
无论如何都可以省略副本。如果在BigClass
的复制构造函数中没有一些可见的副作用来测试并查看发生了什么,就无法确定。 (就像向控制台打印一条消息)
en.wikipedia.org/wiki/Return_value_optimization
【参考方案1】:
VS2010 允许您使用移动语义。
这意味着:std::vector<BigClass> retBigVector() return std::vector<BigClass>();
可以正常工作。
retBigVector 将构造一个大向量并将其移动到您希望的任何位置。
这是移动语义出现的主要原因之一 - VS2010 再次支持这一点。
【讨论】:
很高兴看到你重返职场,+1【参考方案2】:没有返回值优化,boost::shared_ptr<vector<BigClass> >
的开销比vector<boost::shared_ptr<BigClass> >
少。第一个复制一个指针,第二个复制向量内的 N 个共享指针。
另外,第二种形式的缓存/内存一致性较低。每个 BigClass 都在堆上单独分配,其中与第一种形式一样,所有的 BigClass
都在一个连续的块中。
【讨论】:
那个大的连续块可能是个问题。如果内存碎片化,分配大量空间可能会很困难。如果BigClass
足够大,使用共享指针向量而不是指向向量的共享指针可能更容易(在内存方面)。您必须分析您的应用程序以确定哪个更好。
另外,复制一个共享指针包括复制至少一个指针,通常是第二个(对于weakrefs)和原子地增加引用计数。其余的:良好的观察。【参考方案3】:
shared_ptr > 需要更少的内存,尤其是对于大向量; vector > 更灵活,因为它允许对内存有意识的矢量操作,例如添加/删除元素或排序。
如果您的矢量大小可控,我会选择 Fun2。如果您的向量很大,并且您确信返回的向量将用于只读,请使用 Fun1。
【讨论】:
【参考方案4】:试试 boost::vector_ptr: http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_vector.html
然后您可以通过通常的 [] 运算符获取指针。许多其他 ptr_containers 可用。
【讨论】:
以上是关于传递大数据向量的更好方法的主要内容,如果未能解决你的问题,请参考以下文章