【发布时间】:2012-12-10 08:13:04
【问题描述】:
可能重复:
What happens if I return literal instead of declared std::string?
考虑下面的代码
string getName () {
return "meme";
}
string name = getName();
函数getName() 返回一个临时对象。在 C++03 中,我理解 string 的复制构造函数被调用并且临时对象被销毁。实际上,编译器(至少在 GCC 4.7 中)似乎通过不创建对象 name 而是将其替换为临时对象本身而不破坏临时对象来优化第 5 行。 (我尝试使用 MyVector 类,而不是 std::string)
按照 C++11 标准中的定义,
getName()是否返回右值?在上面的第 5 行中,调用了哪个字符串的构造函数(移动或复制)?我是否必须调用
std::move()才能调用移动构造函数?使用移动语义,是不是比编译器提供的“复制省略”优化效率低?
【问题讨论】:
-
那将是 复制省略...
-
@K-ballo 感谢您启发我。
-
添加行号看起来很棒!以前从未见过=)
-
@Coodey:我同意,如果它没有搞砸复制/粘贴。 :P 对我来说,这看起来像是一些我必须编辑出来以获得可编译示例的东西。
标签: c++ c++11 move-semantics copy-elision return-value-optimization