可以说我有以下几点:

struct point
{
  double x;
  double y;
  double z;
};


我可以写以下内容:

void point_mult(point& p, double c) { p.x *= c; p.y *= c; p.z *= c; }
void point_add(point& p, const point& p2) { p.x += p2.x; p.y += p2.y; p.z += p2.z; }


因此,我可以执行以下操作:

point p{1,2,3};
point_mult(p, 2);
point_add(p, point{4,5,6});


这不需要point的副本,只需要两个构造,即point{1,2,3}的构造和point{4,5,6}的构造。我相信即使point_addpoint_multpoint{...}位于单独的编译单元中(即不能内联),这也适用。

但是,我想以更实用的方式编写代码,如下所示:

point p = point_add(point_mult(point{1,2,3}, 2), point{4,5,6});


如何编写point_multpoint_add使得不需要副本(即使point_multpoint_add在单独的编译单元中),或者函数样式在C ++中被迫不那么有效?

最佳答案

让我们忽略这个问题的隐含谬误(即自动复制意味着降低效率)。而且,让我们也忽略这样的问题:是否会真正进行任何复制,或者是否任何半透明的编译器都将其全部删除。让我们从表面上看:不复制就可以做到吗?

是的,它可能是r值引用的唯一其他合法用法(尽管先前被忽略的规定使此用例令人怀疑):

point &&point_mult(point &&p, double c);


当然,这只会绑定到临时对象。因此,您将需要用于l值的备用版本:

point &point_mult(point &p, double c);


关键是您可以按原样传递引用,无论是临时引用还是l值引用。

关于c++ - 高效的功能风格(C++ 11正常),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9494619/

10-09 02:53