use*_*453 4 c++ move-semantics c++11
请问有人请确认该功能出来的字符串是否实际上会被移入成员var?
class Foo {
private:
const std::string m_complex_str;
std::string create_complex_str() {
return std::string("some huge string");
}
public:
Foo() : m_complex_str(std::move(create_complex_str())) { }
};
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
也许大多数编译器会在没有移动功能的情况下为我做这个?
是的,它将被正确移动,正如std::string构造函数支持的那样std::move,返回值create_complex_str()是一个纯rvalue,可以安全地进行move.实际上,std::move即使你不自己动手也会自动调用(设置一个断点并查看) - 除非进一步优化.但是如果你打电话给std::move自己,你可能会阻止编译器通过copy elision/RVO等进一步优化.
在适用的情况下,编译器将为您删除不必要的副本.只需编写代码(不要成为早期优化的牺牲品!),以一种让编译器清楚你的代码应该具有什么逻辑结果的方式做你想做的事情,让它担心优化.所有编译器都对此类案例进行了大量研究,记录和优化.
如果将来你需要性能更高的代码,你应该首先剖析并找到瓶颈所在的确切位置(通常不是你认为的位置),然后再开始使用hackery让它工作更快/更好.
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |