gpt4 book ai didi

c++ - 重载运算符体只包含一个函数调用

转载 作者:行者123 更新时间:2023-11-28 01:44:17 26 4
gpt4 key购买 nike

我有这个功能

int add(T a, T b)
{
return a.blah +b.blah;
}

我想重载加号运算符并且我必须选择(当然,在这种情况下加号运算符已经完成了以下代码的功能)

选项 1:

int operator+(T lhs, T rhs)
{
return add(a,b);
}

选项 2:

int operator+(T lhs, T rhs)
{
return a.blah+b.blah;
}

这些定义中的任何一个都比另一个有性能优势吗?需要注意的是,我尝试实现的函数对 STL 容器的元素执行了更复杂的操作。

最佳答案

使用选项 1,不要重复自己。确保编译器在定义 operator+ 时看到 add 的定义,以便它可以内联代码。启用优化后,生成的代码绝对没有区别。

struct T
{
int blah;
};

int add(T a, T b)
{
return a.blah +b.blah;
}

int operator+(T lhs, T rhs)
{
return add(lhs, rhs);
}

GCC 生成:

add(T, T):
lea eax, [rdi+rsi]
ret
operator+(T, T):
lea eax, [rsi+rdi]
ret

https://godbolt.org/g/g1ypni

Clang 和 Microsoft 编译器生成相同的代码。

如果代码更复杂并且编译器拒绝将 add 内联到 operator+ 中,请考虑将 operator+ 设为内联函数。然后它将被内联,因为它只执行一次调用,调用者将直接调用 add 而无需额外开销。

通常的警告:当然,您应该一如既往地进行基准测试以查看是否存在任何真正的差异和配置文件以查看导致差异的原因,还应查看生成的代码以检查是否按预期执行了优化:-)

关于c++ - 重载运算符体只包含一个函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841178/

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