C++ ISO 標準は、次のように述べています。
"A function defined within a class definition is an inline function."
このルールを無視するコンパイラはありますか?
(インラインをinlineDと間違えないでください-私の質問は、コンパイラがあるかどうかです。それは、インラインの提案をそこに入れません)
C++ ISO 標準は、次のように述べています。
"A function defined within a class definition is an inline function."
このルールを無視するコンパイラはありますか?
(インラインをinlineDと間違えないでください-私の質問は、コンパイラがあるかどうかです。それは、インラインの提案をそこに入れません)
「インライン」の意味を誤解しているようです。関数が自動的にインライン化されるという意味ではありません。7.1.2-2 によれば、インライン置換が優先されることを示します。
したがって、関数がインラインでラベル付けされているかどうかをコードから判断することはできません。これは、コンパイラが何らかの方法で自由に決定できるためです。これは単なるコンパイラのヒントです。
標準では、すべてのコンパイラは、暗黙的であるか明示的であるかに関係なく、インライン リクエストを無視できると規定されています。そうするかどうかは、通常、関数を実際にインライン化できるかどうかに依存します。たとえば、再帰関数はインライン化できません。
編集:明確にするために-質問者は、標準の前のパラグラフから引用したものまで、これを無視しています:
呼び出し時にこのインライン置換を実行する実装は必要ありません。
あなたのテストに欠陥があると思います。コンパイラがインライン指定子を無視するかどうかにかかわらず、そのようなファイルを 1 つだけ使用してテストすることはできません。
インライン関数定義を含むヘッダーをインクルードし、それを複数の実装ファイルにインクルードしてからリンクする必要があります。その関数の複数の定義されたインスタンスに関するリンカ エラーが発生した場合、コンパイラはその最も重要なプロパティに関するインライン指定子を無視しています: プログラム全体で複数回定義することを許可すると同時に、その関数とそのローカルの静的な同じアドレスを保持します。変数。
テストでおそらくチェックするのは、コンパイラが関数の呼び出しをインライン化するかどうかです。これは実際にはコンパイラへのヒントであり、インライン指定子の他の多くの重要な結果のほんの一部です。コンパイラが関数の呼び出しをインライン化しない場合は、インライン化しても問題ありません。標準では、この問題について何もする必要はありません。
コンパイラは通常、関数への呼び出しの数、関数内の疑似命令の数、およびその他の多くに基づいてインライン化されます。どのように動作するかについては、最適化オプションに関する GCC ドキュメントを参照してください。基本的に、inline
キーワードは、コンパイラがインライン化する可能性を高めるヒントにすぎません。通常、インライン化する実際の決定は複雑です。