gpt4 book ai didi

c++ - 高效的函数式风格(C++11 ok)

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:39 26 4
gpt4 key购买 nike

假设我有以下内容:

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);

当然,这只会绑定(bind)到临时对象。所以你需要一个左值的替代版本:

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

重点是您按原样传递引用,作为对临时值的引用或对左值的引用。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com