C++;-从函数返回向量 来自java背景,我试图理解C++中的指针/引用。我试图从函数返回一个向量。写作: vector<char*> f(){ vector<char*> vec; return vec; } 向量f(){ 向量向量机; 返回向量; }

C++;-从函数返回向量 来自java背景,我试图理解C++中的指针/引用。我试图从函数返回一个向量。写作: vector<char*> f(){ vector<char*> vec; return vec; } 向量f(){ 向量向量机; 返回向量; },c++,pointers,vector,C++,Pointers,Vector,将返回向量的副本,对吗?更好的方法是返回指向向量的指针,如下所示: vector<char*>* f(){ vector<char*>* vec = new vector<char*>; return vec; } 向量*f(){ vector*vec=新向量; 返回向量; } 我是对的,还是完全错了?< /p> < p>你错了,你不想在C++中这样做。几乎所有的C++编译器都有所谓的返回值优化,它将有效地使 VEC 被移动,而不是复制,通

将返回向量的副本,对吗?更好的方法是返回指向向量的指针,如下所示:

vector<char*>* f(){
    vector<char*>* vec = new vector<char*>;
    return vec;
}
向量*f(){ vector*vec=新向量; 返回向量; }
<>我是对的,还是完全错了?< /p> < p>你错了,你不想在C++中这样做。几乎所有的C++编译器都有所谓的返回值优化,它将有效地使<代码> VEC <代码>被移动,而不是复制,通过在堆栈上分配返回值的空间,然后基本上构建“就位”。这消除了开销

关于这一点的文章给出了合理的概述

我是对的,还是完全错了

这是完全错误的,至少在存在移动语义的C++11中是这样,只要您不需要为返回的值创建别名(这似乎不是您的情况,即使是这样,也可能需要使用智能指针而不是原始指针)

现在可以通过值返回向量。大多数情况下,即使在C++98中,编译器也会省略对复制构造函数(以及C++11中的移动构造函数)的调用。这就是所谓的


在C++11中,标准库的所有容器都支持移动构造函数,因此即使没有删除副本或移动,按值返回容器也不昂贵。

在C++03中,按值返回很可能导致RVO(返回值优化),这将删除不必要的副本。在C++11中,移动语义将负责复制

那么,为什么首先要按值返回呢?因为它可以防止不必要的对象具有动态生命周期。您的示例代码也不遵守函数用户可能希望使用的任何分配策略

一般来说,即使在C++11中返回容器也是一个坏主意:它将用户限制在特定的容器中,因为不可能跨容器移动,只能复制。标准库使用
输出迭代器解决了这个问题。您的算法很可能会写成:

template<typename OutputIterator>
OutputIterator f(OutputIterator o);
模板
输出器f(输出器o);

通过这种方式,您可以从容器中抽象出来,也可以绕过原始问题。

我不是说它是重复的,但是这个问题很好地讨论了这个问题的各个方面: