私のプログラムに関数があり、コードのどこかに関数ポインタがあります。コンパイラがその関数をインライン化した場合、またはその関数に割り当てられた関数ポインタが存在することをコンパイラが認識し、インライン展開を避けるとどうなりますか。コンパイラが関数ポインタを介して呼び出される関数をインライン化するとどうなるのですか?
答えて
関数へのポインタが取得されると、コンパイラはその関数の行外本体を生成します。他のコールサイトでも機能をインライン化することは可能です。関数はそれを参照するすべてのTUで利用可能な定義を持っている必要がありますinline
をマークし、そしてこれらの定義は同一でなければなりません
注意。つまり、一部の通話サイトで機能をインライン化し、他の通話サイトとは別の場所に保つことは、完全に安全です。
定義が同一ではない場合(ifdefコードなど)、リンカーは複数のバージョンの関数を取得しますか? 'インライン'はおそらく弱い記号としてリンカに見え、最初に出てくるものを手に入れますか? –
@NicholasWilsonそれは不正なプログラムになります。 –
@NicholasWilsonは、1つの定義ルールに違反し、定義された動作を持たないと明示的に呼び出されます。 –
まあ、それは確かに動作します。インライン展開がそれを防ぐ方法はわかりません。あなたは関数を直接呼び出すコードをいくつか持っているだけで、そこにインライン展開されているかもしれませんし、通常の関数と同じように関数ポインタを使ってコードを呼び出すコードもあります。
関数ポインタを使用してインライン化を防止する必要はありません。インライン化は、ケースバイケースで行われ、通常の関数本体と一緒に存在することができます。だから、ある場所で関数をインライン化し、別の場所で関数を呼び出すことができます。
したがって、コンパイラはインラインで関数ポインタの呼び出し可能な関数を生成し、生成することができます。
だけではなく、コンパイラのインライン「機能の他の呼び出し」を行いますが、それは実際に使用されている機能について十分に理解している場合には、関数ポインタ経由でも、インライン呼び出しをしてもよい、このような何か:
typedef void (*funcptr)();
void somefunc()
{
... do stuff here ...
}
void indirection(funcptr *f)
{
f();
}
void call_with_ptr()
{
funcptr f = somefunc();
for(int i = 0; i < 100; i++)
{
indirection(f);
}
}
私はこれに似たコードを持っていて、間接参照をインライン化し、関数ポインタを使わずにsomefunc()を直接呼び出すようにしました。
しかし、もちろん、これは、コンパイラがコードから呼び出される関数で把握することができますを前提と - この場合には明らかであるが、関連するランタイムの決定があれば、それはそうではないことがあります。
- 1. 関数ポインタによる呼び出しの最適化とインライン
- 2. C++:ポインタを介してメンバ関数を呼び出す
- 3. 関数ポインタで使用される関数をインライン化できますか?
- 4. 関数のポインタではなく関数の呼び出し名
- 5. 呼び出された関数から(元の関数で)javascript関数を呼び出していますか?
- 6. Cでは、なぜ関数ポインタが関数呼び出しの方が適しているのですか?
- 7. ポインタと関数呼び出し
- 8. 関数呼び出しから関数呼び出し名を抽出する
- 9. 関数の呼び出し時にconstポインタの引数はどのように最適化されますか?
- 10. 関数ポインタをCポインタ型に渡すと、C関数が呼び出されます
- 11. wxPythonを使用して検索する関数に関数を呼び出す(例)関数を呼び出すにはどうすればいいですか?
- 12. 最後の関数呼び出しで値を返す任意の回数呼び出すことができるカレット化されたjavascript関数を書く
- 13. 関数呼び出しで引数が指定されているかどうかをチェックする方法は?
- 14. jspのURLを介してサーブレットの関数を呼び出す
- 15. 関数呼び出しで値として使用される
- 16. 関数ポインタのスタック:関数の呼び出し方法?
- 17. C#コンパイラがメソッド呼び出しをインライン化しているかどうかを確認できますか?
- 18. C++構文を使用してメンバ関数を呼び出すだ関数ポインタ
- 19. インライン関数呼び出しのメリットは何ですか?
- 20. 関数が呼び出されたかどうかを確認するClojureマクロ
- 21. AngularJS - 別の関数内から関数が呼び出されたかどうかをテストする方法は?
- 22. スマートポインタは、ポインタを介してメンバ関数を呼び出すことをサポートしていますか?
- 23. notification.girmというコールバック関数が常に呼び出される
- 24. 一度しか呼び出されない関数をもう一度呼び出すと、どのような引数を投げるべきですか?
- 25. アプリケーションに渡されるスレッドの数が異なる関数を呼び出す
- 26. インライン関数を呼び出すときの未定義参照
- 27. 関数ポインタを使用して関数を呼び出す - ポインタを逆参照するかどうか違いは何ですか?
- 28. クリックするとjavascript関数が呼び出されます。
- 29. 関数の呼び出し時にポインタのサイズが変更される(gdbを使用してチェックされる)
- 30. innerHTMLで呼び出されるJavascript関数でこれを呼び出す
Herb Sutterの[Inline Redux](http://www.drdobbs.com/inline-redux/184403879)を参照してください。 –