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

Moa*_*sry 7 c++ performance stl c++11

让我说我有功能

std::Vector<Point> calculate() {
   std::Vector<Point> points; //do stuff with points
   return points;
}
Run Code Online (Sandbox Code Playgroud)

void calculate(std::Vector<Point>& points) {
   //do stuff with points
}
Run Code Online (Sandbox Code Playgroud)

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

问候

Nic*_*las 11

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

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

返回值具有以下属性:

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


Luc*_*ore 8

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

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

std::vector<Point> calculate()
Run Code Online (Sandbox Code Playgroud)

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

void calculate(std::vector<Point>& points)
Run Code Online (Sandbox Code Playgroud)

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

  • 除此之外C++ 11终于可以让你为保证(至少`std`容器等精心编写的轻量级包装)对这个性能等效计数,减轻你的信任的负担,你的编译器(通常可能,但仍implementation-定义)优化设施. (4认同)
  • @MoatazElmasry如果输出,只需返回值.这是更合乎逻辑的IMO. (2认同)
  • @MoatazElmasry这就是他的回答.参考参数表示输入/输出,因此具有与返回值不同的语义. (2认同)
  • @MoatazElmasry然后第二个选择将是非常低劣的.例如,您必须记录输入向量不为空时会发生什么,对其执行一些检查等等. (2认同)