質問: 最近「inline」という仕組みを知り色々と調べているのですが、ロベールのC++教室やQoosky等の記事では「inline関数の実装はヘッダに記述する」と記述があります(ロベールではクラスの宣言と記述はありますが)。 ここで一つ確認なのですが、これは > > コンパイル時に処理を埋め込む際に埋め込む内容が明らかである必要であり、故にヘッダーに実装内容が記述されているべきである。 > > > という解釈でよろしいのでしょうか。 また、以前inlineを試しに使ってみようとしたところ、誤っていつも通りcpp側に実装を記述してしまいましたが一応問題なく動いていました。 しかしこれはコンパイル時に > > 1. 全.h読み込み... > 2. コンパイラ「おい! inline関数の中身がねぇぞ!」 > 3. 全.cpp読み込み... > 4. コンパイラ「ここにあるじゃねえか!」 > 5. 再度.cpp読み込んでinline関数呼び出し側に埋め込み... > > > という(私の勝手なイメージの)流れによりcppを読み込むオーバーヘッドが生まれている為無駄であるという事になるのでしょうか。 よろしくお願いいたします。
回答: コンパイラーはオブジェクトファイルを生成し、リンカという別のツールが複数のオブジェクトファイルを結合して実行ファイルを生成します。ですので、 > > 5. 再度.cpp読み込んでinline関数呼び出し側に埋め込み... > > > というようなステップとはならず774RRさんが回答されているように通常の関数呼び出しとして結合されます。 しかし、 * GCCのLTO; Link Time Optimization * ClangのLTO; Link Time Optimization * Visual C++のLTCG; Link Time Code Generation など、コンパイラーとリンカが協調してリンク時に最適化を行うことがあります。コンパイラーが最適と判断すればリンク時に再コンパイルが行われインライン展開が行われます。 (組み込み系コンパイラとは状況が違うということかな?)