这是个有趣的问题。在 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!!!
}
在您的特定情况下,这取决于大型数组对您意味着什么,如果它们是std::array
(或者具有自动存储的数组),那么它们不能被移动,所以这无论如何都不是一个选项,但是如果大型数组是动态分配的记忆,移动将比复制更有效率。请注意,在 C++11 中,存在而不是不存在const
会导致性能损失。
*这不是100% 正确的,如果移动赋值运算符通过rvalue-reference获取参数const
,那么它可以被移动。但是标准库中的任何类型都没有以这种方式接受参数,我也不希望人们这样做(它需要const_cast
在移动操作(构造函数/赋值)中,这没有任何意义:如果你计划从中移动(窃取),您为什么声称不修改它?