次の2つのコードスニペットの間に最適化はありますか?CとC++のコード最適化
ケース1:
int func()
{
int a = 10;
return a;
}
最初の場合は、関数内の変数に値を代入し、その変数を返します。
ケース2:
int func()
{
return 10;
}
第二の機能は、単に値を直接返します。
さらに、どちらが高速ですか?
次の2つのコードスニペットの間に最適化はありますか?CとC++のコード最適化
ケース1:
int func()
{
int a = 10;
return a;
}
最初の場合は、関数内の変数に値を代入し、その変数を返します。
ケース2:
int func()
{
return 10;
}
第二の機能は、単に値を直接返します。
さらに、どちらが高速ですか?
どちらの関数も、半二重コンパイラと同じマシンコードになります。ローカルの一時変数を最適化することは、コンパイラが1980年代からできることです。
これは、複雑な式の可読性を向上させるためにローカル変数を使用するのが良い考えです。あなたのケースでは、ローカル変数は余分なだけです。そう
func():
mov eax, 10
ret
、
-O1
(またはそれ以上)で
スイッチが有効になって、両方のスニペットが同じアセンブリを製造、性能面では、両方の断片は同じです。
どうしましたか?私はDVに説明を求めることができますか? –
私も不思議です。根拠の説明の欠如? – songyuanyao
@songyuanyaoわかりませんが、どのように欠けているのか分かりません。どちらのスニペットも同じアセンブリを生成するので、違いはありません。 DVの理由は何ですか? (+ 3/-3)、私は実際に驚いています。 –
int
のような単純なタイプの場合、パフォーマンスにはほとんど違いはありません。他の人が指摘するように、アセンブラは同じです。
C++の複雑な型の場合、答えはより微妙なものであり、コピーエリジョンと移動セマンティクスの使用に依存する可能性があります。ほぼすべてのタイプのインスタンス化が可能なテンプレートを実装する場合は、特に考慮する価値があります。
std::vector<>
の実装は、割り当てや移動が必要な不要なコピーを作成しないように非常に注意しています。
これはあまり良い質問ではありません。広すぎる..... –
まず、C/C++と呼ばれる言語はありません。次に、それを試して見てください。 – dandan78
の違いは、最初のものはコンパイルされないということです。 – user463035818