4

最新の C++ コンパイラは、次のようなショートカットを使用することを理解しています。

if(true)
{do stuff}

しかし、次のようなものはどうですか:

bool foo(){return true}
...
if(foo())
{do stuff}

Or:

class Functor
{

 public:
        bool operator() () { return true;}

}

...

Functor f;

if(f()){do stuff}
4

3 に答える 3

5

foo()コンパイラが同じコンパイル単位で認識できるかどうかによって異なります。

最適化を有効にするfoo()と、が呼び出し元と同じコンパイルユニットにある場合、呼び出しがインライン化され、最適化が以前と同じチェックにfoo()簡略化されます。if (true)

別のコンパイルユニットに移動foo()すると、インライン化が行われなくなるため、ほとんどのコンパイラはこのコードを最適化できなくなります。(リンク時の最適化はコンパイル単位全体で最適化できますが、それほど一般的ではありません。すべてのコンパイラがそれをサポートしているわけではなく、一般的には効果が低くなります。)

于 2012-12-21T19:06:59.783 に答える
4

で試しg++ 4.7.2たところ-O3、どちらの例でも呼び出しが最適化されています。がなければ-O、そうではありません。

于 2012-12-21T19:00:15.910 に答える
1

最新のコンパイラは信じられないほど賢く、「プログラム全体の最適化」を行うことがよくあります。したがって、賢明なことを行う限り、定数値を返すだけの関数呼び出しを確実に最適化します。コンパイラは、一度しか呼び出されないコードも [非常に大きい場合でも] インライン化するため、大きな関数ではなく小さな関数を作成することは間違いなく価値があります。もちろん、関数を複数回使用すると、インライン化されない場合がありますが、同じ関数を 2 つの場所から呼び出し、全体的なコードを小さくすることで、キャッシュ ヒット率が向上します。

于 2012-12-21T19:26:44.997 に答える