6

どのような条件下で、インライン関数はインライン関数ではなくなり、他の関数として機能しますか?

4

3 に答える 3

8

神話:
inlineコンパイラが従うかもしれないし従わないかもしれない単なる提案です。優れたコンパイラは、とにかく実行する必要があることを実行します。

真実:
inline通常、呼び出しのポイントでの関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることを実装に示します。呼び出しの時点でこのインライン置換を実行するために実装は必要ありません。ただし、このinline置換が省略されている場合でも、のその他のルール(特に1つの定義ルール)が適用されinlineます。

どのような条件下で、inline関数は関数ではなくなり、inline他の関数として機能しますか?

引用された事実を考えると、この質問にはより深い文脈があります。

関数を関数として宣言するとstatic inline、その関数は他のstatic関数と同じように機能し、キーワードinlineは重要ではなくなり、冗長になります。

関数のstaticキーワードは、関数inlineに内部リンケージを強制します。(inline関数には外部リンケージがあります)このような関数の各インスタンスは個別の関数として扱われ(各関数のアドレスは異なります)、これらの関数の各インスタンスには独自のコピーがあります静的ローカル変数と文字列リテラル(関数にはこれらのコピーが1つだけありますinline

于 2012-06-02T10:11:00.253 に答える
1

それはコンパイラの裁量です。

ただし、次のように、インライン化できない場合もあります。

  • 再帰関数
  • アドレスがどこかで参照されている関数
  • 仮想関数(いくつかの例外が考えられます)
于 2012-06-02T10:09:55.490 に答える
1

それはコンパイラの最適化に依存します。

コンパイラが異なれば、コードをより効率的にするためのルールも異なります。ただし、関数をインラインとして宣言する場合、そのルールのいずれにも違いがない限り、コンパイラは決定を尊重する傾向があります。

コンパイラはメソッドの実行パスを完全に変更できることに注意してください。たとえば、次の状況を考えてみましょう。

int MyClass::getValue()
{
  return someVariable;
}

コンパイル時に、この種の関数をインラインとして宣言するかどうかにはほとんど違いがありません。おそらく、コンパイラは属性を部分的に公開してコード化します。

myInstance->getValue()

なので

myInstance->someVariable

したがって、ほとんどの場合、それはより審美的な決定です。

于 2012-06-02T10:10:33.413 に答える