4

これは「私はこの問題を抱えています」という質問ではなく、「言語がどのようにうまく機能するかを本当に理解したい」という質問です。

最近、特定のクラスの .cpp ファイルでインライン機能の定義に遭遇し始めました。インライン機能の定義ポイントの実際の違いを理解したいと思います。CPP で定義されたインラインのオブジェクト レベルの分析を行うと、(.h で定義されているのではなく) C++ で宣言されているインラインの割合が、正当にインライン化されるのではなく、マップされた関数に最適化されているようです。これが大きな違いですか、それとも私が見ていないこの完全な背後にある他の目的があります。

4

5 に答える 5

3

違いはありません。inlineコンパイラへのヒントですが、最近では特に重要ではありません。コンパイラは、ユーザーの助けなしにインラインで関数を展開するかどうかを判断するのが得意だからです (registerキーワードを参照)。

inlineまた、ヘッダー ファイルにインライン関数を配置するときに必要な、異なる翻訳単位での複数の定義が問題ない (それらが同じである場合) ことをコンパイラに伝えます。

インライン関数が .cpp ファイルで定義されている場合、その定義はそのファイルでのみ表示されるため、他のソース ファイルから呼び出しても機能しません。

于 2012-08-27T18:37:38.460 に答える
2

inline関数は、翻訳単位ごとに 1 つだけの定義がないと意味がありません。そのため、定義を再利用できるヘッダー ファイルに配置するのが理にかなっています。関数が 1 つのソース ファイルでのみ使用される場合inlineは、ローカルで定義するのが理にかなっています。それはすべて文脈の問題です。

于 2012-08-27T18:32:41.913 に答える
1

違いは、コンパイラが「リンク時」/「プログラム全体」の最適化を行っていないことが原因である可能性があります。これは、コンパイラが単一の翻訳単位ではなくプログラム全体を見て最適化を実行する場合です。これは通常、非常に高いメモリ使用量を伴うため、それをサポートするコンパイラであっても、デフォルトではオンにならないことがよくあります。

翻訳単位レベルでのみ最適化する場合、定義が利用できないため、他のソース ファイルで定義されている関数をインライン化することはできません。

于 2012-08-27T18:42:01.313 に答える
1

インライン関数は、呼び出しの後ではなく呼び出しの前に定義されている場合、コンパイラにとってインライン化が容易になります。通常、ヘッダー ファイルはソースの先頭に含まれているため、この条件はより簡単に満たされます。

于 2012-08-27T18:48:57.430 に答える