重载运算符:const vs非const返回类型:性能的任何差异?

Vin*_*ent 9 c++ optimization performance operator-overloading

如果我们去维基百科关于C++运算符的文章,我们举个例子:

Addition : a + b -> T T::operator +(const T& b) const;
Run Code Online (Sandbox Code Playgroud)

所以运算符返回类型为T 的非const.如果我们看一下这个指南,作者说返回类型应该是一个const,以避免以下语法:

(a+b) = c
Run Code Online (Sandbox Code Playgroud)

现在假设这个语法不会打扰我,并认为a和b是大数组.从"纯"性能的角度来看,返回类型中缺少const关键字是否会阻止编译器的优化(g ++和intel icpc with -O3)?如果aswer是"是",为什么?

Dav*_*eas 7

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

另一方面,在C++ 11中,它实际上可能会产生影响.特别是,如果你的类型支持移动操作,并且无法省略复制/移出返回的值,那么通过返回const你实际上是禁用移动*

// 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!!!
}
Run Code Online (Sandbox Code Playgroud)

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


*这不是100%为真,如果移动赋值运算符通过rvalue-reference获取参数const,则可以移动它.但是标准库中没有一个类型以这种方式接受参数,我也不希望人们这样做(它需要const_cast移动操作中(构造函数/赋值)并且它没有任何意义:如果你计划从它移动(偷窃),为什么你声称不修改它?