次のコードがあるとします。
struct obj {
int i;
obj() : i(1) {}
obj(obj &&other) : i(other.i) {}
};
void f() {
obj o2(obj(obj(obj{})));
}
リリース ビルドでは、実際には 1 つのオブジェクトのみが作成され、コードが実行された場合と結果が同じであるため、move コンストラクターが呼び出されることはないと予想されます。ほとんどのコードはそれほど単純ではありませんが、オプティマイザーが「あたかも」を証明するのを妨げる可能性のある、予測が難しい副作用がいくつか考えられます。
- 移動コンストラクタまたはデストラクタのいずれかで、グローバルまたは「外部」のものへの変更。
- 移動コンストラクタまたはデストラクタでの潜在的な例外 (いずれにせよおそらく設計が悪い)
- 内部カウントまたはキャッシュ メカニズムの変更。
私はこれらのどれも頻繁に使用しないので、後で最適化されるためにインライン化される関数の出入りのほとんどが期待できますか、それとも何かを忘れていますか?
PS最適化が可能だからといって、特定のコンパイラによって最適化が行われるわけではないことを私は知っています。