返回const std :: string真的比非const慢吗?

ben*_*ist 3 c++ c++11 c++14

在另一个问题中,用户评论说,返回const std :: string会丢失移动构造效率,并且速度较慢。

分配此方法的返回字符串是否真的正确:

const std::string toJson(const std::string &someText);

const std::string jsonString = toJson(someText);
Run Code Online (Sandbox Code Playgroud)

...确实比非const版本慢:

std::string toJson(const std::string &str);

std::string jsonString = toJson(someText);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,移动施工效率是什么意思?

我以前从未听说过该限制,并且不记得在分析器中看到过该限制。但是我很好奇。

编辑:有一个建议的问题,问:什么是移动语义?。虽然某些解释当然与效率有关,但它解释移动语义的含义,但没有解决为什么返回const值会对性能产生负面影响的原因。

Bar*_*rry 12

考虑以下功能:

std::string f();
std::string const g();
Run Code Online (Sandbox Code Playgroud)

之间没有区别:

std::string s1 = f();
std::string s2 = g();
Run Code Online (Sandbox Code Playgroud)

现在我们已经保证复制省略,在这两种情况下,我们都直接构造到结果对象中。没有副本,没有动静。

但是,两者之间有很大的区别:

std::string s3, s4;
s3 = f(); // this is move assignment
s4 = g(); // this is copy assignment
Run Code Online (Sandbox Code Playgroud)

g()可能是一个右值,但它是一个常量右值。它不能绑定到string&&移动赋值运算符采用的参数,因此我们退回到复制赋值运算符,其string const&参数可以愉快地接受右值。

对于类型为的移动,复制肯定比移动慢string,在此类中,移动是固定时间,复制是线性的,可能需要分配。

不要返回const值。


最重要的是,对于非类类型:

int f();
int const g();
Run Code Online (Sandbox Code Playgroud)

这两个实际上是相同的,都返回int。这是一种奇怪的语言,您不能返回非类类型的const prvalue,但是可以返回类类型的const prvalue。假装您也不能做后者,因为您不应该这样做。