stl数据结构的堆栈输出参数与返回值的效率

时间:2012-08-21 14:14:10

标签: c++ performance stl c++11

让我说我有功能

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对象。性能有什么不同,这种流行的方法是什么

问候

3 个答案:

答案 0 :(得分:9)

将值作为参考参数具有以下属性:

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

    1. 如果复制省略不可用(由于函数实现的性质,编译器不良,或者返回值没有初始化新值),则返回值将移动。没有复制。运动不是免费的,但通常它不比几个指针副本贵得多。不会分配或取消分配新对象或内存。
    2. API 强制执行值的输出性质。用户无法使用它传入的输出,因为它没有传入任何内容。同样,函数无法读取任何值,因为它不需要任何内容​​。它是一个输出价值,期间;该函数生成它并返回它。
    3. 可以在用户的​​自由裁量时立即丢弃返回值。显然,如果用户做了很多事情,它表明出现了问题,但用户需要决定是否要保留输出值。

答案 1 :(得分:8)

因为复制省略,性能很可能会相同。

这两种方法表达的是不同的

std::vector<Point> calculate()

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

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

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

答案 2 :(得分:1)

我的拙见:返回值产生的问题多于解决方案...看起来更简单,在调用段中更简洁,但避免使用右值引用...