0

私の質問は、C での関数呼び出しに特に当てはまります。そのため、関数を通常どおり呼び出すことも、関数ポインターを介して呼び出すこともできます。インターフェイスが同じままで実装が異なる場合、関数ポインターが使用されますが、関数ポインターを持つ単一の実装がある場合でも、コードの可読性を向上させることができます。

では、動的関数ポインターではなく静的呼び出しを使用する利点は何ですか。関数のアドレスをフェッチする必要があるため、呼び出しは明らかに 2 つの命令で実装されますが、戻りには同じサイクルが必要です。理解したいのですが、プロセッサとコンパイラが動的関数ポインタに対する静的呼び出しを最適化するにはどうすればよいですか?

ありがとう、

4

2 に答える 2

3

ポインターを介して関数を呼び出すと、ほとんどの場合、コンパイラーは呼び出しをインライン化できなくなります (インライン化することが有益であるとコンパイラーが判断した場合)。場合によっては、コンパイラーは結果を判別することさえできます。コンパイル時に関数呼び出しを削除し、関数のコード全体を最適化します。関数ポインタもこれを防ぎます。

ただし、実際に重要な方法で影響が顕著になるという意味ではありません。それを判断する唯一の方法は、コードに行ってベンチマーク/プロファイリングすることです。

ただし、関数ポインターがどのようにコードの可読性を向上させることができるかはわかりません。その例を挙げたいと思うかもしれません。

于 2012-12-08T00:38:13.793 に答える
0

一般に、直接呼び出しを使用すると、コンパイラーをさらに最適化できます。

実際に実装が 1 つしかなく、コンパイラがそれを認識できる場合 [*]、直接呼び出しとまったく同じように最適化して実行できます。ただし、もちろん、コンパイラがどれほど賢いか、および使用する最適化オプションによって異なります。

[*] つまり、ポインター値がコンパイル時にわかっている場合。つまり、「静的」変数の場合、そのアドレスはコンパイル単位の外に渡されることはありません。

于 2012-12-08T00:46:39.183 に答える