または、インライン キーワードが単なるヒントである理由を尋ねることができますか?
あなたはコンパイラよりもよく知っているかもしれないからです。
ほとんどの場合、インラインとマークされていない (そして正しく宣言/定義されていない) 関数の場合、コンパイラは、その構成と実装に応じて、関数をインライン化できるかどうかを評価します。
たとえば、ほとんどのコンパイラは、コードが長くない場合や複雑すぎる場合、ヘッダーで完全に定義されているメンバー関数を自動的にインライン化します。これは、関数がヘッダーで使用できるため、できる限りインライン化しないのはなぜですか? ただし、これは発生しません。たとえば、Visual Studio のデバッグ モードでは発生しません。デバッグでは、デバッグ情報は関数のバイナリ コードをマップする必要があるため、インライン化は回避されますが、ユーザーが要求したため、インラインとマークされた関数はインライン化されます。それ。これは、デバッグ時のパフォーマンスを向上させながら、デバッグ時の情報 (単純なゲッターなど) を必要としない関数をマークしたい場合に役立ちます。リリース モード (デフォルト) では、コンパイラは可能な限りすべてを積極的にインライン化します。
したがって、一般的な考え方は、コンパイラのインライン化を支援する方法でコーディングすると、可能な限りインライン化されるということです。インライン化が困難または不可能な方法でコードを記述した場合、それは回避されます。何かをインライン化すると、インライン化が困難であるが不可能ではない場合、インライン化する必要があることをコンパイラに伝えるだけです。
インライン化は呼び出し元と呼び出し先の両方のコンテキストに依存するため、「ルール」はありません。多くの場合、インライン関数を明示的にマークすることを単純に無視することをお勧めしますが、次の 2 つの場合があります。
- 関数定義をヘッダーに入れる必要がある場合は、インライン化するだけです。多くの場合、テンプレート (メンバーであるかどうかに関係なく) 関数や、単なるショートカットであるその他のユーティリティ関数に当てはまります。
- たとえば、特定のコンパイラがコンパイル時に特定の方法で動作するようにする場合は、たとえば、Visual Studio コンパイラのデバッグ構成でも、一部のメンバー関数をインラインにマークしてインライン化するなどです。
コンパイラは常にプログラマよりも優れていますか?
いいえ、それが inline キーワードを使用すると役立つ場合がある理由です。プログラマーは、コンパイラーよりも何が必要なのかについて、より良い一般的な見方を持つことができます。たとえば、プログラマーがバイナリをできるだけ小さくしたい場合、コードによっては、インライン化が有害になる可能性があります。速度性能が要求されるアプリケーションでは、積極的にインライン化することが非常に役立ちます。コンパイラは何が必要かをどのように知るのでしょうか? 構成して、本当にインラインにしたいものをきめ細かく知ることができるようにする必要があります。