C++ 传递大数据向量的更好方法
需要设计一个函数来返回BigClass的数组。为了防止不必要的复制,我有两个选择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 { 国
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