gpt4 book ai didi

c++ - 没有中间对象的操作分配

转载 作者:行者123 更新时间:2023-11-30 04:11:21 27 4
gpt4 key购买 nike

给定这样一个类:

class Vec{
int comp[2];
public:
void add(Vec& vec, Vec& vec2){
comp[0] = vec.comp[0] + vec2.comp[0];
comp[1] = vec.comp[1] + vec2.comp[1];
}
Vec operator+ (Vec& vec){
Vec res;
res.comp[0] = comp[0] + vec.comp[0];
res.comp[1] = comp[1] + vec.comp[1];
return res;
}
};

有两个成员函数本质上做的是同一件事,就是将两个 Vec 相加。当然,不同之处在于 add 函数中没有涉及中间值,而 operator+ 声明了 Vec 的局部对象。

我的问题是,是否有任何方法可以定义 operator+operator= 的组合,使其具有与 add 相同的语义,没有中间值?基本原理是减少涉及的中间值的数量,以提高效率,同时保持 operator 语法的优雅。

GMP 库的 C++ 接口(interface)显然能够做到这一点:http://gmplib.org/manual/C_002b_002b-Interface-General.html#C_002b_002b-Interface-General

An important feature of the implementation is that an expression like a=b+c results in a single call to the corresponding mpz_add, without using a temporary for the b+c part.

我想知道是否有某种可能的方法可以做到这一点,或者 GMP 是否必须为此使用某种解决方法?

最佳答案

这是个坏主意,因为它违反了大多数人对运算符(operator)行为的自然假设。

不幸的是,它也非常重要(尤其是对于像 gmpxx 这样的库,它们希望提供使用运算符的自然代码、高性能,并以巨大的对象作为参数)。他们如何做到这一点?通过使用表达式模板,他们可以在编译时优化表达式。这个想法是运算符不直接返回值,而是返回表达式类的具体实例,然后可以使用元编程对其进行操作。

表达式模板是一个相当高级的主题,您应该相对确定它会给您的代码带来显着的好处。在您的示例中, vector 的大小根本不够相关。

Wiki Expression Templates

关于c++ - 没有中间对象的操作分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20276707/

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