2

編集:この質問はO0でのコンパイラの決定について尋ねるため、重複ではありません。

ここでは、Name Return Value Optimization (NRVO) は、多くのコンパイラがサポートする最適化であると言われています。しかし、それは必須の最適化ですか、それともあると便利な最適化ですか?

私の状況では、-O0デバッグの便宜上 (つまり、最適化なしで) コンパイルしたいのですが、オブジェクト (ベクトルなど) を返す return ステートメントに対しても NRVO を有効にしたいと考えています。-O0NRVO が必須でない場合、コンパイラはおそらくモードでそれを行いません。この場合、次のコードを優先する必要があります。

std::vector<int> foo() {
    std::vector<int> v(100000,1); // an object that is really big..
    return std::move(v);  // explicitly move
}

この下に?

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // copy or move?
}

編集: 私が使用しているコンパイラは GCC6 ですが、コードをコンパイラに依存しないようにしたいと考えています。

4

1 に答える 1