假设我有以下内容:
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++中不是很有效?
发布于 2012-02-29 15:34:11
让我们忽略这个问题的隐含谬误(即复制自动意味着效率降低)。让我们忽略这样一个问题:是否真的会发生任何复制,或者是否所有复制都会被任何不太像样的编译器省略掉。让我们从表面上看:这可以在不复制的情况下完成吗?
是的,这可能是r-value引用的唯一其他合法用途(尽管之前被忽略的规定使得这个用例值得怀疑):
point &&point_mult(point &&p, double c);当然,这只会绑定到临时对象。因此,您将需要一个替代版本的l值:
point &point_mult(point &p, double c);关键是,您可以按原样传递引用,或者作为对临时变量的引用,或者作为对l值的引用。
发布于 2012-02-29 14:56:16
https://stackoverflow.com/questions/9494619
复制相似问题