編集:この質問はO0でのコンパイラの決定について尋ねるため、重複ではありません。
ここでは、Name Return Value Optimization (NRVO) は、多くのコンパイラがサポートする最適化であると言われています。しかし、それは必須の最適化ですか、それともあると便利な最適化ですか?
私の状況では、-O0
デバッグの便宜上 (つまり、最適化なしで) コンパイルしたいのですが、オブジェクト (ベクトルなど) を返す return ステートメントに対しても NRVO を有効にしたいと考えています。-O0
NRVO が必須でない場合、コンパイラはおそらくモードでそれを行いません。この場合、次のコードを優先する必要があります。
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 ですが、コードをコンパイラに依存しないようにしたいと考えています。