2016-08-27 9 views
-3

最適なC++プログラムの作成に関する質問があります。変数の代わりに式を使用するC++コードの最適化

私のような表現を計算する関数があります。

c= a/2 
c = (a*b)/2 
c = (a/2) + b 

など は、それは、これらの値を保存するか、単にreturn <expression>を使用するために変数を使用して良いですか?

変数の作成にスペースがかかり、return <expression>がそれを避けると理解しています。しかし、これらがいくつかのリターンである場合、変数を宣言するよりもオーバーヘッドが増えますか?

+3

両方のケースで生成されたアセンブリコードを確認することができます。 – sjsam

+5

最適化コンパイラはこれをすべて見て、同じコードにコンパイルします。 –

+1

「共通部分式消去」というフレーズを参照してください。 –

答えて

2

何も違いはありません。

コンパイラは、差分をなくし、未使用の中間体を取り除き、式を最適化し、呼び出された関数をインライン展開するなど、いくつかの最適化を実行します。これらの最適化は、基本的に違いはありません。ここでは間違ったことに集中しています。タスクに適切なアルゴリズムを選択するなど、より高度な最適化が重要です。

あなたがここで行うべき最もよいことは、わかりやすく読みやすく、保守しやすいコードを書くことです。

5

これは、無用なマイクロ最適化の典型的なケースです。コンパイラはおそらく変数をとにかく最適化します。

変数を使用する理由は、ドキュメントになります。私が意味することは、変数に意味のある名前を付けることができるということです。しかし、これは非常に良い議論ではありません。なぜなら、関数名は関数が返すものを既に表現しているはずだからです。

したがって、ほとんどの場合、変数に最初に代入することなく式を返します。コードに追加する各変数は、追加の変更可能な状態を意味します。これは、複雑さを増すため、一般的に悪いとみなされます。

+0

それは*非常に良い議論です! –

+0

@ JasonC:関数名よりどれだけ表現力があると思いますか?問題は、変数を代入してから直接返すことです。 –

+0

私はそれを支持する賛辞として、これは非常に良い答えであることを意味しました。 Varの名前とfnの名前は、どちらか一方ではありません。両方を行います。表現型関数名と表現型変数名。たとえば、返す変数は、返される前に関数本体全体で使用されている可能性があります。それが何を意味するか分かりました!一般的に変数名。 –

0

前述のように、コンパイラはこれをとにかく最適化しますが、デバッグとメンテナンスも考慮します。式の結果を直接返すと、頭痛の種になる可能性があります。あなたの関数の結果がベクトルのサイズを決定するが、結果は負であるという非常に簡単な例を考えてみましょう。

関連する問題