可以说我有以下几点:
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_add
,point_mult
和point{...}
位于单独的编译单元中(即不能内联),这也适用。但是,我想以更实用的方式编写代码,如下所示:
point p = point_add(point_mult(point{1,2,3}, 2), point{4,5,6});
如何编写
point_mult
和point_add
使得不需要副本(即使point_mult
和point_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/