2017-05-03 11 views
-7

次の2つのコードスニペットの間に最適化はありますか?CとC++のコード最適化

ケース1:

int func() 
{ 
    int a = 10; 
    return a; 
} 

最初の場合は、関数内の変数に値を代入し、その変数を返します。

ケース2:

int func() 
{ 
    return 10; 
} 

第二の機能は、単に値を直接返します。

さらに、どちらが高速ですか?

+0

これはあまり良い質問ではありません。広すぎる..... –

+0

まず、C/C++と呼ばれる言語はありません。次に、それを試して見てください。 – dandan78

+1

の違いは、最初のものはコンパイルされないということです。 – user463035818

答えて

8

どちらの関数も、半二重コンパイラと同じマシンコードになります。ローカルの一時変数を最適化することは、コンパイラが1980年代からできることです。

これは、複雑な式の可読性を向上させるためにローカル変数を使用するのが良い考えです。あなたのケースでは、ローカル変数は余分なだけです。そう

func(): 
     mov  eax, 10 
     ret 

-O1(またはそれ以上)で

2

いずれの有益なコンパイラも、これらの2つのケースに対して本質的に同一のコードを構築することが期待されます。

+0

を意味しています。P – user463035818

3

スイッチが有効になって、両方のスニペットが同じアセンブリを製造、性能面では、両方の断片は同じです。

+0

どうしましたか?私はDVに説明を求めることができますか? –

+0

私も不思議です。根拠の説明の欠如? – songyuanyao

+0

@songyuanyaoわかりませんが、どのように欠けているのか分かりません。どちらのスニペットも同じアセンブリを生成するので、違いはありません。 DVの理由は何ですか? (+ 3/-3)、私は実際に驚いています。 –

1

intのような単純なタイプの場合、パフォーマンスにはほとんど違いはありません。他の人が指摘するように、アセンブラは同じです。

C++の複雑な型の場合、答えはより微妙なものであり、コピーエリジョンと移動セマンティクスの使用に依存する可能性があります。ほぼすべてのタイプのインスタンス化が可能なテンプレートを実装する場合は、特に考慮する価値があります。

std::vector<>の実装は、割り当てや移動が必要な不要なコピーを作成しないように非常に注意しています。

+1

"intのような原子型" - 原子型は 'std :: atomic 'となります。単純な 'int'が原子的であるという保証はありません。 – MSalters

+0

@MSalters公正なポイント。それは混乱する用語です。私はもちろん 'int'のような組み込みのプリミティブ型を意味します。編集されました。 – Persixty