10

假设我有这些功能

std::Vector<Point> calculate() {
   std::Vector<Point> points; //do stuff with points
   return points;
}

void calculate(std::Vector<Point>& points) {
   //do stuff with points
}

所以我的问题是特定于在堆栈上初始化的对象,并且是 stl 对象。性能上有什么区别,流行的方法是什么

问候

4

3 回答 3

13

以该值作为参考参数具有以下性质:

  1. 不会进行复制、移动或任何其他操作。
  2. 返回值不能在用户端立即丢弃。他们不能只是在你的函数的引用参数或其他东西上临时推一下。他们必须声明一个变量,因此他们必须给它一个将存在于当前范围内的名称。
  3. API建议该值是输入/输出参数。也就是说,有一个值被传入,将被读取和写入。如果不是这样,那么使用它代表了一个次优的 API 设计元素。

返回值具有以下属性:

  1. 如果复制省略不可用(由于函数实现的性质、不良编译器或返回值未初始化新值),则返回值将被移动。没有复制。移动不是免费的,但一般不会比几个指针副本贵多少。不会分配或释放新的对象或内存。
  2. API强制执行值的输出性质。用户无法使用它传入的输出,因为它没有传入任何内容。同样,函数无法读取任何值,因为它不接受任何内容。它是一个输出价值,时期;该函数生成它并返回它。
  3. 返回值可以根据用户的决定立即丢弃。显然,如果用户经常这样做,则表明有问题,但由用户决定是否要保留输出值。
于 2012-08-21T17:00:49.710 回答
10

由于复制省略,性能很可能是相同的。

两种方法表达的不同

std::vector<Point> calculate()

返回一个向量(可能基于一些参数)。

void calculate(std::vector<Point>& points)

修改现有向量(同样,可能基于参数)。

于 2012-08-21T14:18:06.263 回答
2

我的拙见:返回值产生的问题比解决的问题多……它们看起来更简单,在调用段中更简洁,但是会避免右值引用……

缺点是表达能力会降低,但这是一个很小的成本,因为像内存分配这样的资源会向上游移动。

C++ 必须而且可以在语法和资源管理方面得到显着简化。

于 2020-12-12T22:06:02.550 回答