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

Can I use std::move on the result of function to construct a new object?

本文关键字:一个 对象 新对象 结果 函数 move std 我可以      更新时间:2023-10-16

有人能确认从该函数中产生的字符串是否真的会被移动到成员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())) { }
};

这样做对吗?

也许大多数编译器都会在没有move函数的情况下为我这样做?

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

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

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

相关文章: