我可以在函数的结果上使用std :: move来构造一个新对象吗?

时间:2013-02-11 01:03:23

标签: c++ c++11 move-semantics

有人可以确认该功能产生的字符串是否实际上会被移入成员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())) { }
};

这是正确的方法吗?

也许大多数编译器会在没有移动功能的情况下为我做这个?

1 个答案:

答案 0 :(得分:5)

是的,它会被正确移动,因为std::string构造函数支持std::movecreate_complex_str()的返回值是一个纯r值,可以安全地move'd 。实际上,即使您不自己执行std::move也会自动调用(设置断点并查看) - 除非进一步优化。但是如果你自己调用std::move,你可能会阻止编译器通过copy elision / RVO等进一步优化。

在适用的情况下,

The compiler will eliminate unnecessary copies为您服务。只需编写代码(不要成为早期优化的牺牲品!),以一种让编译器清楚代码应该具有的逻辑结果的方式执行您希望它执行的操作,并让它担心优化。所有编译器都对此类案例进行了大量研究,记录和优化。

如果将来需要性能更高的代码,您应首先剖析并找到瓶颈的确切位置(通常您认为可能存在),然后才会然后开始使用hackery让它更快/更好地工作。