2013-05-05 15 views
5

この回答ではhttps://stackoverflow.com/a/4193698/738811と書かれていますが、「デフォルトではインライン関数には外部リンケージがあります」と書かれています。しかし、デフォルトでは、インラインであるものとリンクすることは不可能です。インライン関数に外部リンケージがあると言うのはどういう意味ですか?インライン関数と外部リンケージ

答えて

5

名前のリンケージは、名前が特定のオブジェクトや関数を参照するために使用される場所とまったく同じように、定義されている場所や方法とは関係ありません。

関数をインラインで宣言しても、強制的にインライン化されるわけではありません。 1つの定義ルールをリラックスして、使用されている各翻訳単位で定義できるようにします(呼び出される各翻訳単位で1つずつ定義する必要があります)。コンパイラが特定の呼び出しをインライン化しないことを決定した場合、またはそのアドレスを使用する場合、インラインでないバージョンが生成されるのを防ぎません。

"外部リンケージ"と "インライン"は排他的ではありません。 「外部リンケージ」とは、任意の翻訳単位で機能を参照できることを意味し、「インライン」とは、それを呼び出す翻訳単位で定義する必要があることを意味します。

0

「リンケージが必要な場合は外部になります」と表現する方がいいかもしれません。つまり、インライン関数のアドレスを取ると、そのアドレスは外部から見えます(モジュールには静的ではありません)。

0

インライン関数はインライン展開されている必要はありません。そうでないときは、言語定義では関数のコピーが1つだけ必要です。

0

インライン関数は、通常、他のコンパイル単位からリンク可能です。インライン関数としては表示されません。コンパイルされたファイルに関数のコピーがあります。これはフリーのインライン関数に適用されます。クラスメンバ関数は、通常、 "非インライン"使用のための関数のコピーを取得しません。よいリンカは、コードが再利用されない場合、コードを「デッドコード」として削除します。

関連する問題