4

有人可以确认从该函数出来的字符串是否实际上会被移动到成员变量中?

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())) { }
};

这是正确的方法吗?

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

4

1 回答 1

5

是的,它会被正确移动,因为std::string构造函数支持std::move,返回值create_complex_str()是一个纯右值,可以安全地move'd。事实上,std::move即使你自己不做也会自动调用(放一个断点看看)——除非可以执行进一步的优化。但是如果你打电话给std::move自己,你可能会阻止编译器通过复制省略/RVO等进一步优化。

编译器将在适用的情况下为您消除不必要的副本。只需编写您的代码(不要成为早期优化的牺牲品!)以使编译器清楚您的代码应该具有什么逻辑结果的方式来执行您希望它执行的操作,并让它担心优化。所有编译器都对此类案例进行了大量研究、记录和优化。

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

于 2013-02-11T01:29:03.110 回答