なし静的メンバー関数は暗黙的にポインタthis
を持っています。だから、これらのインライン関数はクラス外で呼び出されたときにコンパイラに置き換えられません。これは、クラスインライン関数の使用が非常に制限されているようです!クラスインライン関数が呼び出されたときにコンパイラは実際に何をしますか?
答えて
最適化コンパイラは、希望に応じてinlineとすることができます。
たとえば、あなたはコンパイルかもしれないとリンクg++ -flto -O2
(リンク時、プログラム全体optimization option ... GCCの)と、プログラム全体。
(警告:大幅ビルド処理が遅くなりg++ -flto -O2
を使用して、基本的にすべてがほぼ「二回」にコンパイルされ、一回一回GIMPLE表現が再最適化されます「リンク」の時間、で、時間を「コンパイル」で)
あなたは、どのような関数呼び出しがインラインになるか(多くは可能性があります)に驚いています。これは、静的な機能とは関係なく、マークされているかどうかはinline
です。
だから、インライン化についてのケア(それが実装と最適化の詳細である)が、あなたのコンパイラは、良い仕事をすること希望べきではありません。
(時々g++
であなたがgdb
とデバッグを容易にするために、ほとんどのインライン化を無効にしたい。そして、withg++ -fno-inline -Wall -Wextra -O0 -g
をコンパイル)
彼らはクラスの外に呼び出されたときしたがって、これらのインライン関数は、コンパイラによって置き換えられません、私は正しい?あなたは間違っている
、this
はちょうど暗黙の引数(もthat参照)、そしてもちろんコンパイラは、多くの場合、メンバ関数への呼び出しをインライン化しています。 の実践コンパイラがその最適化を行わなかった場合(多くのメンバ関数-e.g. gettersとsetters - 非常に短く素早いので)、C++は非効率的になります。
C++は仕様(コンパイラではありません)と書かれています。インライン化は実装上の問題であり、発生する可能性もありません。
コンパイラが実際に何をしているのか気にしていて、気にする必要はありませんが、あなたのコードにundefined behaviorを避ける必要がある場合は、生成されたアセンブラコードを表示してください。 GCCをg++ -O2 -fverbose-asm -S
とコンパイルしてfoo.s
アセンブラファイルをfoo.cc
翻訳単位から取得します。
'-fno-fat-lto-objects'を使うと、ダブルコンパイルを防ぐことができます。 –
しかし、まだLTOのコンパイルは遅いです –
あなたが書いたように2回ではありません。 –
インラインメンバ関数が呼び出されると、コンパイラはどの関数呼び出しに対しても何もしません。引数を準備して関数を呼び出します。関数呼び出しはすべてインライン展開の対象です。一部の関数はインライン化できません(e.g. functions using alloca
or vararg functions、定義が利用できない関数)が、インライン化を防ぐことはできません。
「一部の関数はインライン化されません」という意味です。非常に巧妙なコンパイラは、理論上は 'alloca'や' va_arg'を使って関数をインライン展開することができます。実際には(GCC)(http://gcc.gnu.org/)はこれを行うことができませんが、たくさんの仕事があれば、あなたが本当にしたいと思うならそれをするかもしれません(例えば、月にGCCプラグインをコード化する) –
@BasileStarynkevitchこれは理論的に可能です。しかし、私はそれが既存の制限のいくつかに言及する価値があると思った。 –
- 1. 呼び出されるたびにPHP関数が実行されますか?
- 2. ngrx:reducers関数が呼び出されたときにどのように呼び出されますか?
- 3. 単体テスト中にメソッド呼び出しが試行されたが、実際には呼び出していないが、実際には呼び出さない
- 4. onRegionChangeCompleteは、実際にイベントが終了したときではなく、何度も呼び出されます。
- 5. ng-showがトリガーされたときに関数を呼び出しますか?
- 6. mysql_queryが呼び出されるたびに関数を実行します。 (PHP)
- 7. コードがFindByEmailを呼び出したときに、それは実際に()FindByEmailAsyncを呼び出し、なぜ()
- 8. 呼び出しと適用が関数にネストされたときを指す "this"キーワードは何ですか?
- 9. Python:setterが呼び出されたら関数を呼び出しますか?
- 10. blur()から実際の関数を呼び出します。
- 11. モックは実際の関数を呼び出し続けます
- 12. ActionScript:次回同じ関数が呼び出されたときに変更された関数呼び出しから返されたオブジェクトですか?
- 13. Python:なぜwhileループ内で呼び出された関数は、単独で呼び出されたときとは異なる何かを返しますか?
- 14. Kudan:マーカーが検出されたときに関数を呼び出すことはできますか?
- 15. 関数が呼び出されていないときに関数が実行されます
- 16. PHPunitメソッドが1回呼び出されると予想され、実際に0回呼び出されます
- 17. 本体がコンストラクタを呼び出すと、コンストラクタは関数を呼び出し、関数を呼び出そうとしたときにクラッシュします。
- 18. Swift:NSTextFieldが編集されたときの呼び出し関数
- 19. Visual C++コンパイラは、このptrを呼び出された関数にどのように渡しますか?
- 20. 呼び出された関数が実行される前にコードを実行
- 21. Pythonの関数を呼び出すときに関数が実行されないのはなぜですか?
- 22. 私がviを実行するときに呼び出される関数
- 23. 呼び出された関数から(元の関数で)javascript関数を呼び出していますか?
- 24. 呼び出されたときに関数が実行されていませんか?
- 25. 返品後にajaxStart関数が呼び出されました
- 26. 変数が変更されたときに関数を呼び出す
- 27. log.Fatallnを呼び出すときに遅延関数が呼び出されますか?
- 28. 変数が呼び出されるときにプロセスを実行
- 29. デバッグが停止したときに関数を呼び出す
- 30. hrefリンクと同時にフラッシュ関数を呼び出すと、フラッシュ関数は常に実行されますか?
Cにはクラスがないため、これは成果物です。私は、しかし、あなたは明らかに、コードサンプルとおそらく質問の意味を理解することはできません? – Quentin
暗黙の 'this'引数を持つことがインライン展開と関係していると思われるのはなぜですか? – HolyBlackCat
コンパイラは、情報が正しく渡され、必要に応じてコードが動作することを保証する限り、必要な機能をインライン化できます。ただし、コンパイラはコンパイラによって異なります。 – Peter