私はこの議論に言及しています。C や C++ でコードを書いたことはありません。CSのバックグラウンドはありません。しかし、私は Java 開発者として 5 年間働いており、今は CS についてもっと学び、キャッチアップすることにしました。
10 に答える
特定のコードを実行するとき、標準関数を呼び出すたびに、実行時間はその関数に含まれるコードをそこにダンプするよりもわずかに長くなります。関数に含まれるコード全体を毎回ダンプすることは、明らかにコードの重複の全体的な混乱につながるため、保守できません。
インライン化は、関数をインラインとして(少なくとも C++ で)宣言できるようにすることで、パフォーマンスと保守性の問題を解決します。これにより、その関数を呼び出すと、アプリが実行時にジャンプするのではなく、インライン関数のコードがコンパイル時に挿入されます。指定された関数が呼び出されるたびに。
これの欠点は、何度も呼び出す大きな関数をインライン化すると、プログラムのサイズが大幅に増加する可能性があることです (実際には小さな関数でのみ実行することをお勧めします)。
http://en.wikipedia.org/wiki/インライン化
コンピューティングでは、インライン展開またはインライン化は、関数呼び出しサイトを呼び出し先の本体に置き換えるコンパイラの最適化です。この最適化により、実行時の時間とスペースの使用が改善される可能性がありますが、最終的なプログラムのサイズが大きくなる可能性があります。
Java 開発者は通常、メソッドのインライン化について心配する必要はありません。Java の Just-in-time コンパイラは、それが意味のあるほとんどの場所で自動的に実行できます。
eclipse などの IDE には、ソース コード レベルでメソッドをインライン化できる機能があります。これは、パフォーマンスのためではなく、コードの読みやすさのためだけに行ってください (たとえば、メソッド自体が有用なものを何も追加せずに別のメソッドを呼び出すだけであることに気付いた場合)。
他の回答で既に述べたように、インライン化にはコストがかかります。通常、これは小さいと見なされますが、実際に測定すると、得られるものよりも大きい可能性があることに驚くかもしれません (したがって、他の人の言うことは真実です: 測定しない限り最適化しないでください)。
Linux カーネルでは、元々インライン化されていた関数のインライン化を解除し始めたのは、コストが高すぎるためでした (関数が大きくなると、CPU メモリ キャッシュをより多く消費し、結果として生じるキャッシュ ミスは、単に関数を呼び出すよりもコストがかかりました)。インライン化することを意図していた)。詳細については、 doc/Documentation/process/coding-style.rstの「第 15 章: インライン病」を参照してください。
コンパイラの最適化の答えは正しいです。ただし、別の使用法があります。リファクタリングでは、インライン化は、メソッド呼び出しをメソッドの本体に置き換えてからメソッドを削除することを指します。インライン メソッドを参照してください。Inline Classなど、同様のリファクタリングがあります。
編集: リファクタリングは手動またはツールを使用して行われることに注意してください。どちらの場合も、ソース コードを変更する必要があります。
基本的に、C/C++ では、コンパイラは関数をインライン化できます。つまり、その操作を実行するために関数呼び出しを行うのではなく、呼び出し元の関数のブロックにコードが追加されるため、別の関数ではなかったかのようになります。関数呼び出し。
詳細については、http: //www.codersource.net/cpp_tutorial_inline_functions.htmlを参照してください。
インライン化とは、別の呼び出しを必要とするのではなく、コードの小さな関数が呼び出し元の関数に挿入されるコンパイル時の最適化を指します。
インライン関数は通常、Java ではなく C++ ヘッダー ファイルで使用されます。通常、C++ ヘッダー ファイルには実装されたコードは含まれず、通常は実装されたコードが含まれる同じ名前の cpp ファイルへのインターフェイスと見なされます。ヘッダー ファイルにインライン関数を含めることは合法であり、通常は小さな軽量関数です。インライン関数にはコストがかかるため、メモリを大量に消費する操作は避けてください。小さなルーチンの場合、パフォーマンスへの影響は最小限であり、利便性のために使用されます。
その議論の中で、Jon Skeet はクライアント jvm (ホットスポット) v サーバー jvm に言及し、JIT (ジャストインタイム) コンパイラが時間ベースの機能強化を許可されている場合、実行時に利用可能なパフォーマンスの向上を実現します。それがJavaの「やり方」です。
もともと、多くの場所から呼び出されなかったコードの小さなセクションは、コンパイラによって「インライン化」されていました。つまり、シングルトンと呼ばれるものは、命令ポインター コード パスに直接配置され、関数の分岐と戻りを行うと、より多くのプロセッサ パワーが消費されました。ループまたは関数呼び出しに展開して命令を「すぐそこに」配置するよりも
今日、シングルトンは複数ページの議論の対象であり、ループの展開やインライン化のようなものは、元のコンテキストから多少削除されています。この問題に関する Dov Bulka の非常に情報に基づいた作業を読んで、C/C++ がこの問題を理解することができます。Java の場合、java.util の豊富なライブラリを研究する方が、インライン化やコンパイラの深い問題を研究するよりもニーズに応えます。あなたの学習曲線に終わりはありません。
Java で instanceof を実行できます。これは vf-table に似ていますが (熱心な方はご遠慮ください)、これまで強く型付けされた言語で書いてきたと考えてください。文字列が簡単に暴走できる言語で書くことになります。事業のないところ。私は最近、Java で Image を構築するコードを C コードから作成しようとしました。私はすぐに、強力な暗号化のために oxr テーブルを見ていることに気付きました - それは私が書いていたコードとは何の関係もありません。
C/C++ で、32 バイト未満の文字列用の小さなバッファーを持ち、文字列のみを操作するようにポインターをトラップする文字列クラスをどのように作成しますか?
あなたや何かをからかおうとしているのではなく、インライン化やコンパイラーの科学ではなく、始めるのに本当に良い場所です.