C++ 传递大数据向量的更好方法

C++ 传递大数据向量的更好方法,c++,boost,stl,C++,Boost,Stl,需要设计一个函数来返回BigClass的数组。为了防止不必要的复制,我有两个选择 struct BigClass { int manyfields; }; boost::shared_ptr<vector<BigClass> > Fun1() { throw; } vector<boost::shared_ptr<BigClass> > Fun2() { throw; } struct BigClass { 国

需要设计一个函数来返回BigClass的数组。为了防止不必要的复制,我有两个选择

struct BigClass
{
    int manyfields;    
};

boost::shared_ptr<vector<BigClass> > Fun1()
{
    throw;
}

vector<boost::shared_ptr<BigClass> > Fun2()
{
    throw;
}
struct BigClass
{
国际多领域;
};
boost::shared_ptr Fun1()
{
投
}
向量Fun2()
{
投
}
问题>哪种方法是更好的选择?如果以上都不好,请提供一个更好的


谢谢

VS2010允许您使用移动语义

这意味着:
std::vector retBigVector(){return std::vector();}
会很好用。
retBigVector将构造一个大的向量,并将其移动到您希望的任何位置


这是移动语义出现的主要原因之一,同样,VS2010支持这一点。

VS2010允许您使用移动语义

这意味着:
std::vector retBigVector(){return std::vector();}
会很好用。
retBigVector将构造一个大的向量,并将其移动到您希望的任何位置


这是移动语义出现的主要原因之一,VS2010也支持这一点。

共享\u ptr>需要更少的内存,尤其是对于大向量;vector>更灵活,因为它允许有记忆意识的向量操作,例如添加/删除元素或排序


如果向量的大小可以控制,我会选择Fun2。如果您的向量很大,并且您确信返回的向量将用于只读功能,请使用Fun1。

共享\u ptr>将需要更少的内存,尤其是对于大向量;vector>更灵活,因为它允许有记忆意识的向量操作,例如添加/删除元素或排序


如果向量的大小可以控制,我会选择Fun2。如果您的向量很大,并且您确信返回的向量将用于只读功能,那么在没有返回值优化的情况下,
boost::shared_ptr
vector
的开销更小。第一个复制一个指针,第二个复制向量中的N个共享指针


此外,第二种形式具有较少的缓存/内存一致性。每个BigClass在堆上分别分配,其中与第一种形式一样,所有的
BigClass
都在一个连续块中。

没有返回值优化,
boost::shared\u ptr
的开销比
vector
小。第一个复制一个指针,第二个复制向量中的N个共享指针

此外,第二种形式具有较少的缓存/内存一致性。每个BigClass在堆上分别分配,其中与第一种形式一样,所有的
BigClass
都在一个连续的块中。

Try boost::vector\u ptr:

然后可以通过常用的[]运算符获取指针。还有许多其他ptr_容器可用。

试试boost::vector_ptr:


然后可以通过常用的[]运算符获取指针。还有许多其他ptr_容器可用。

返回引用不是选项吗?(
std::vector&func(void);
):vc您可以使用c++11移动语义吗?VS2010具有移动语义,因此无论如何都可以省略该副本。在
BigClass
的复制构造函数中,如果没有一些可见的副作用来测试和查看发生了什么,就无法确定。(如将消息打印到控制台)是否返回引用而不是选项?(
std::vector&func(void);
):vc您可以使用c++11移动语义吗?VS2010具有移动语义,因此无论如何都可以省略该副本。在
BigClass
的复制构造函数中,如果没有一些可见的副作用来测试和查看发生了什么,就无法确定。(就像在控制台上打印一条消息)那个大的连续块可能是个问题。如果内存碎片化,分配大量空间可能会很困难。如果
BigClass
足够大,那么使用共享指针的向量(内存方面)可能比使用指向向量的共享指针更容易。您必须分析应用程序以确定哪一个更好。此外,复制共享指针至少需要复制指针,通常是第二个指针(对于weakrefs)并自动增加引用计数。对于其他人:好的观察。那个大的连续块可能是个问题。如果内存碎片化,分配大量空间可能会很困难。如果
BigClass
足够大,那么使用共享指针的向量(内存方面)可能比使用指向向量的共享指针更容易。您必须分析应用程序以确定哪一个更好。此外,复制共享指针至少需要复制指针,通常是第二个指针(对于weakrefs)并自动增加引用计数。对于其他人:很好的观察。很高兴看到你重返商界,+1很高兴看到你重返商界,+1