在 C++ 中返回一个向量
Posted
技术标签:
【中文标题】在 C++ 中返回一个向量【英文标题】:Returning a vector in C++ 【发布时间】:2014-01-06 14:11:19 【问题描述】:我刚刚阅读了this post on SO,它讨论了 STL 向量在内存中的存储位置。根据接受的答案,
vector<int> temp;
栈上向量的头信息,堆上的内容。
那么,下面的代码会出错吗?
vector<int> some_function()
vector<int> some_vector;
some_vector.push_back(10);
some_vector.push_back(20);
return some_vector;
我应该改用vector<int> *some_vector = new vector<int>
吗?上面的代码会导致一些内存分配问题的代码吗?如果我使用自定义类的实例而不是 int
,这种情况会改变吗?
【问题讨论】:
some_function
中的代码很好,可以正常工作。它将复制(使用复制构造函数)some_vector
的内容到接收向量中。
你的函数很好,避免使用动态分配的内存,除非它真的需要并且你知道你在做什么。
@JoachimPileborg:实际上,我认为它会将向量移动。不会吗?
@yzt 在 C++11 编译器中,是的,它可能会。
通过复制返回向量会更慢,对吧?我的意思是它必须将所有内容复制到接收向量中。如果您担心速度,请将向量移动到池中并返回指向它的指针。
【参考方案1】:
你的代码很好。
向量管理它们为您分配的所有内存。
无论他们是使用动态分配来存储所有内部数据,还是将某些元数据作为直接成员(具有自动存储持续时间),都没有关系。任何内部执行的动态分配都将在向量的析构函数、复制构造函数和其他类似的特殊函数中安全地清除。
您无需执行任何操作,因为所有这些都已从您的代码中抽象出来。您的代码对该机制没有可见性,并且动态分配向量本身不会对其产生任何影响。
这就是他们的目的!
【讨论】:
【参考方案2】:如果您决定动态分配向量,即使在非常简单的情况下也很难正确销毁它(不要忘记异常!)。尽可能避免动态分配。
换句话说,您的代码完全正确。我不会担心将返回的向量复制到内存中。在这些简单的情况下,编译器(在发布版本中)应该使用返回值优化/RVO(http://en.wikipedia.org/wiki/Return_value_optimization)并在返回对象的内存中创建 some_vector。在 C++11 中,您可以使用移动语义。
但如果你真的不信任使用 RVO 的编译器,你总是可以传递一个对向量的引用并将其填充到函数中。
//function definition
void some_function(vector<int> &v) v.push_back(10); v.push_back(20);
//function usage
vector<int> vec;
some_function(vec);
回到动态分配,如果你真的需要使用它,试试称为 RAII 的模式。或者使用智能指针。
【讨论】:
【参考方案3】:在内部向量定义其数据的位置并不重要,因为您通过副本返回向量。:)(按值)这与返回整数相同
int some_function()
int x = 10;
return x;
【讨论】:
以上是关于在 C++ 中返回一个向量的主要内容,如果未能解决你的问题,请参考以下文章