gpt4 book ai didi

c++ - 重载运算符 : const vs non-const return type : any difference of performance?

转载 作者:可可西里 更新时间:2023-11-01 16:37:43 27 4
gpt4 key购买 nike

如果我们去维基百科article关于 C++ 运算符,我们有一个例子:

Addition : a + b -> T T::operator +(const T& b) const;

因此运算符返回类型为 T 的非常量。如果我们看这个guideline作者说返回类型应该是 const 以避免以下语法:

(a+b) = c

现在假设我不介意这种语法,并考虑 a 和 b 是大数组。从“纯”性能的角度来看,返回类型中缺少 const 关键字是否会阻止编译器的优化(g++ 和带有 -O3 的英特尔 icpc)?如果答案是"is",为什么?

最佳答案

这是一个有趣的问题。在 C++03 中,没有更好的机会使用这两个选项中的任何一个进行优化,这将是样式选择的问题(我自己不相信 const 的整个返回到避免不太可能的错误)。

另一方面,在 C++11 中,它实际上可能会产生影响。特别是,如果您的类型支持移动操作,并且无法省略返回值的复制/移动,则通过 const 返回可以有效地禁用移动 */p>

// T is move assignable, with the usual declaration of a move assignment operator
T f();
const T g();
int main() {
T t;
t = f(); // can move
t = g(); // cannot move!!!
}

在您的特定情况下,这取决于大型数组 对您意味着什么,如果它们是std::array(或其他具有自动存储的数组),那么它们不能移动,所以这无论如何都不是一个选项,但是如果大数组是动态分配的内存,移动将比复制更有效率。请注意,在 C++11 中 存在 而不是 const 的缺失会导致性能下降。


* 这不是100% 正确,如果移动赋值运算符通过rvalue-reference 将参数设为const,那么它就可以移动了。但是标准库中的类型都没有以这种方式接受参数,我也不希望人们这样做(它需要 const_castmove 操作中(要么构造函数/赋值),这毫无意义:如果您计划移动(窃取)它,为什么您会声称不修改它?

关于c++ - 重载运算符 : const vs non-const return type : any difference of performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11919197/

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