3

私はコンパイラの専門知識がほとんどありません (読む必要はありません)。次のコード スニペットが比較的最近の (VS2008+/GCC 4.3+) コンパイラによって自動的に最適化されるかどうか疑問に思っていました。

Object objectPtr = getPtrSomehow();

if (objectPtr->getValue() == something1)       // call 1
    dosomething1;
else if (objectPtr->getValue() == something2)  // call N (there are a few more)
    dosomething2;

return;

ここで、getValue() は単に列挙型の 1 つであるメンバー変数を返します。(呼び出しには目に見える効果はありません)

私のコーディング スタイルは、"switch" の前に 1 つの呼び出しを行い、値を保存してそれを somethingX のそれぞれと比較することですが、これが今日のコンパイラでは議論の余地があるのではないかと思っていました。

また、これに対する答えを自分で見つけるために何をグーグルで検索すればよいかわかりませんでした。

ありがとうございました、

AK

4

4 に答える 4

4

特にメソッドが変更可能な場合は、問題ありません。

getValueが宣言されていない場合const、後続の呼び出しが異なる値を返す可能性があるため、呼び出しを最適化することはできません。

宣言されている場合はconst、より簡単ですが、コンパイラが呼び出しを最適化するのは簡単ではありません。呼び出しに副作用がないことを確認するには、実装にアクセスする必要があります。マークされていても別の値を返す可能性もありconstます (変更してグローバルを返します)。

于 2012-12-06T19:37:21.363 に答える
3

コンパイラがコードの一部をコンパイルする間に の定義を調べることができない限り、getValue()2 番目の呼び出しを省略できません。これは、その呼び出しに観察可能な効果があるかどうか、2 回目に同じ値を返すかどうかがわからないためです。

定義が表示されたとしても、おそらく(これは、一部のコンパイラの内部を少し覗いてからの私の勝手な推測です)、わざわざチェックすることはありません。あなたが立つ唯一のチャンスは、実装が些細2回インライン化され、共通の部分式の除去によって捕らえられることです編集:定義はヘッダーにあり、非常に小さいため、これ (インライン化とその後の CSE) が発生する可能性があります。それでも、確認したい場合は、g++ -O2 -Sまたはコンパイラの同等の出力を確認してください。

要約すると、最適化が行われることを期待すべきではありません。繰り返しになりgetValueますが、おそらく非常に安価であるため、手動で最適化する価値はありません。数回のマシン サイクルと比べて余分な行は何ですか? ほとんどの場合、それほど多くはありません。大量のコードを書いている場合は、質問するのではなく、チェックする (逆アセンブル/プロファイリング) だけにすべきです。

于 2012-12-06T19:43:18.473 に答える
2

他の回答が指摘しているように、副作用がある可能性があるため、コンパイラは通常、2番目の呼び出しを排除できません。

ただし、一部のコンパイラには、関数に副作用がなく、この最適化が許可されていることをコンパイラに伝える方法があります。GCC では、関数をpureと宣言できます。例えば:

int square(int) __attribute__((pure));

この関数には「値を返す以外の効果はなく、戻り値はパラメータやグローバル変数のみに依存する」と述べています。</p>

于 2012-12-06T19:53:55.520 に答える
1

あなたが書いた:

私のコーディング スタイルは、"switch" の前に 1 つの呼び出しを行い、値を保存してそれぞれの somethingX と比較することですが、これは今日のコンパイラでは議論の余地があるのではないかと思っていました。

はい、それは論点です。コンパイラが行うことは、それがビジネスです。あなたの手は、私たちの誰もが望んでいるよりもはるかに優れた仕事をしているソフトウェアを細かく管理しようとせずに、保守可能なコードを書こうとしていっぱいになります。

保守可能なコードを書くことに集中し、コンパイラーがそのタスクを実行することを信頼してください。後でコードが遅すぎることがわかった場合は、最適化について心配することができます。

次のことわざを思い出してください。

時期尚早の最適化は諸悪の根源です。

于 2012-12-06T19:43:41.237 に答える