3

この質問は、静的ライブラリを実装しているときに発生しました。
私の推測を確認し、静的ライブラリでのインライン関数の使用に関する情報を取得したいと思います。

  • 私の推測では、静的ライブラリ
    の実装者は自分のライブラリでインライン関数をエクスポートできないということです関数本体からコード セグメントへ取り付けられています。私の論理は正しいですか?

  • 関数をインラインとしてインポートすることは許可されていると思いますが、それがどのように実装されているのかは、コンパイラの責任ですが、リンケージ状態ではライブラリアンしかないため、関数をインラインにするために何らかのアクションを実行する必要があることを意味します。

4

3 に答える 3

6
  1. はい、インライン関数は通常ヘッダーに配置されるため、関数が使用されるすべての場所で関数本体がコンパイラーに直接表示されます。これにより、コンパイラは、特定のインスタンスで関数のインラインコードを生成するかどうかを評価できます。

  2. これは基本的には発生しません。「インライン関数は、それがodrで使用されるすべての変換単位で定義される必要があります。」(§3.2/ 3)。つまり、コンパイラが関数をインラインで生成する場合、ライブラリに入るのは、その関数のコードのインライン展開を含むオブジェクトコードです。関数は使用するたびにインラインで展開されない可能性があるため、通常はライブラリに関数の定義もありますが、その定義は(少なくとも主に)通常の関数のように使用され、インラインで展開されません。

ただし、リンカーはコードを生成することもできます。関数が言語標準による関数であるかどうかに関係なく、inline使用されているものと同じまたは異なる翻訳単位で定義されている場合でも、リンカはその関数のインラインコードを生成できる可能性があります。

簡単に言うとinline、関数のコードがインラインで生成されるかどうかに関しては、キーワードは一般的なコンパイラにほとんどまたはまったく影響を与えません。主な(唯一ではないにしても)効果は、単一定義規則を変更することです。インラインであるということは、同じ関数の複数の(同一の)定義が問題を引き起こすことなく存在できることを意味します。

于 2013-03-01T14:13:51.910 に答える
2

キーワードを理解していますか?inlinereplaceも同様に使用できます。

インライン関数を使用すると、関数呼び出しを実際のコードに置き換えることを選択した場合にコンパイルが可能になります。エクスポート/インポートするものはありません。ヘッダーファイルで定義されています。オブジェクトコードを使用するものはすべてそのヘッダーコードを必要とするため、コンパイラは関数呼び出しを実際のコードに置き換えます。

于 2013-03-01T14:08:51.307 に答える