どのような条件下で、インライン関数はインライン関数ではなくなり、他の関数として機能しますか?
3 に答える
神話:
inline
コンパイラが従うかもしれないし従わないかもしれない単なる提案です。優れたコンパイラは、とにかく実行する必要があることを実行します。
真実:
inline
通常、呼び出しのポイントでの関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることを実装に示します。呼び出しの時点でこのインライン置換を実行するために実装は必要ありません。ただし、このinline
置換が省略されている場合でも、のその他のルール(特に1つの定義ルール)が適用されinline
ます。
どのような条件下で、
inline
関数は関数ではなくなり、inline
他の関数として機能しますか?
引用された事実を考えると、この質問にはより深い文脈があります。
関数を関数として宣言するとstatic inline
、その関数は他のstatic
関数と同じように機能し、キーワードinline
は重要ではなくなり、冗長になります。
関数のstatic
キーワードは、関数inline
に内部リンケージを強制します。(inline
関数には外部リンケージがあります)このような関数の各インスタンスは個別の関数として扱われ(各関数のアドレスは異なります)、これらの関数の各インスタンスには独自のコピーがあります静的ローカル変数と文字列リテラル(関数にはこれらのコピーが1つだけあります)inline
。
それはコンパイラの裁量です。
ただし、次のように、インライン化できない場合もあります。
- 再帰関数
- アドレスがどこかで参照されている関数
- 仮想関数(いくつかの例外が考えられます)
それはコンパイラの最適化に依存します。
コンパイラが異なれば、コードをより効率的にするためのルールも異なります。ただし、関数をインラインとして宣言する場合、そのルールのいずれにも違いがない限り、コンパイラは決定を尊重する傾向があります。
コンパイラはメソッドの実行パスを完全に変更できることに注意してください。たとえば、次の状況を考えてみましょう。
int MyClass::getValue()
{
return someVariable;
}
コンパイル時に、この種の関数をインラインとして宣言するかどうかにはほとんど違いがありません。おそらく、コンパイラは属性を部分的に公開してコード化します。
myInstance->getValue()
なので
myInstance->someVariable
したがって、ほとんどの場合、それはより審美的な決定です。