3

ある関数が別の関数を呼び出し、インライン化が必要な場合、2 つの関数の定義の順序は重要ですか? 2 つの定義が同じ翻訳単位で発生するとします。

私が主に興味を持っているのは、C++ 標準がそれについて述べていることです。ただし、特定のコンパイラでのインライン展開に関する重要な情報がある場合は、それにも関心があります。リンク時の最適化は行われない (無効になっている) と仮定してください。

具体的には、次の 2 つのバージョンは、C++ 標準に従ってインライン化を達成する可能性が同じですか?

バージョン 1:

inline void foo() { ... }
void bar() { ... foo(); ... }

バージョン 2:

inline void foo();
void bar() { ... foo(); ... }
void foo() { ... }

編集: この質問は、一般的なインライン化の達成に関するキーワードの有効性に関するものではないことに注意してください。私は具体的に、インライン化の実現に関連する関数定義の順序inlineについて標準が何かを述べているかどうかについて尋ねます。

4

2 に答える 2

4

C++ 標準は、ここで何の強制も行いません。コンパイラは、適切と思われる状況で自由にインライン化するかどうかを選択できます。inline キーワードは、同じ関数の複数の定義を許可する以外に効果がない場合があります。

ほとんどのコンパイラは、ソースに表示される順序に関係なく、翻訳単位で使用できる関数をインライン化できます。前方宣言は通常、ソース ファイルの特定の時点で使用可能な名前にのみ影響し、バイナリの最終出力には影響しません。

于 2013-07-15T21:00:20.280 に答える
3

実際には、inlineキーワードはコードのインライン化とはあまり関係がなくlegal violation、1 つの定義規則を許可することと関係があります。inline の主な目的は、関数が複数の翻訳単位に出現する可能性があること (およびそれぞれの翻訳単位で同じ定義を持つこと) をコンパイルに伝えることです。これにより、リンク段階での複数の定義エラーを回避できます。

キーワードを使用してinlineも、コンパイラが関数をインライン化するという保証はまったくありません。これは単なる提案です。さらに、多くのコンパイラは、定義が翻訳単位内に表示され、コンパイラが価値があると判断した場合、インラインとしてマークされていない関数をインライン化します。あなたが示しているバージョンは、特定のコンパイラによってインライン化されているか、インライン化されていないかのいずれかであると強く思われます。

つまり、コンパイラにインライン化するかどうかを決定させ、最も読みやすい方法でコードを記述します。

于 2013-07-15T21:13:14.940 に答える