4

その関数から出てくる文字列が実際にメンバー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関数なしでこれを実行しますか?

4

1 に答える 1

5

はい、std::stringコンストラクターがサポートしているため、正しく移動されますstd::move。の戻り値create_complex_str()は、安全に移動できる純粋な右辺値moveです。実際、std::move自分で実行しなくても(ブレークポイントを設定して参照)、さらに最適化を実行できない限り、自動的に呼び出されます。ただし、std::move自分自身を呼び出すと、コンパイラがコピーの省略/RVOなどを介してさらに最適化するのを停止する可能性があります。

コンパイラは、必要に応じて、不要なコピーを削除します。コードを書くだけで(初期の最適化の犠牲にならないでください!)、コードがどのような論理的結果をもたらすかをコンパイラーに明確にする方法で、コードに実行させたいことを実行し、最適化について心配させます。このようなケースは、すべてのコンパイラーによって徹底的に研究され、文書化され、最適化されています。

将来、よりパフォーマンスの高いコードが必要になった場合は、最初にプロファイルを作成し、ボトルネックがどこにあるかを正確に特定してから(通常は、考えている場所ではない)、次にハッカーを使用してコードを機能させる必要があります。より速く/より良い。

于 2013-02-11T01:29:03.110 に答える