14

重複の可能性:
関数/メソッドのキーワード「インライン」はいつ記述すればよいですか?

ですから、これはしばらくの間私を悩ませてきた質問であり、決定的な答えを得ることができません. 私の理解では、優れたコンパイラは一般に、関数をインライン化することが安全で有利であることを認識し、最適化がオンになっている場合、インライン関数として明示的に識別されているすべての関数をインライン化します。プログラマによるかどうか。また、コンパイラは、関数をインライン化するのが安全でない/適切でない場合を認識し、そのような場合に関数をインライン化するプログラマの要求を単純に無視します。

したがって、関数をインラインとして明示的に記述することの利点は何ですか? 最適化がオンになっている限り、コンパイラは、インライン化するのが適切であると判断したすべての関数、およびそれらの関数のみをインライン化します。

ネストされた h ファイルによる複数の定義に対するインライン保護に関するいくつかの議論を見つけましたが、ヘッダー ソース コードを #ifdefine することはより良い方法であり、キーワード inline void の使用を再びレンダリングしますか?

4

2 に答える 2

15

あなたはコンパイラの最適化についてよく知っています。あなたは何が何であるかについてのあなたの仮定が間違っていますinline。名前にもかかわらず、inline最適化のためではありません。主に、免責で1つの定義ルールinlineに「違反」することです。基本的に、多くの翻訳単位がその定義を参照できることをリンカに伝えます。そのため、複数の翻訳単位でその定義を見つけることにバーフするべきではありません。

関数をインライン化するためのヒントとして扱うコンパイラもありますが、それは完全にコンパイラ次第であり、そのヒントを無視することは完全に有効です。

ヘッダー ガードは、同じ翻訳単位での複数の定義からのみ保護します。それらは翻訳単位をまたいで機能しません。

于 2012-07-16T15:57:06.180 に答える
8

ヘッダー ガードは、複数の定義エラーから保護しません。

複数の定義がリンカーによって検出され、同じ定義が別々のコンパイル単位に含まれている場合に発生します。

于 2012-07-16T15:56:55.030 に答える