VC++ で、呼び出されることのない未使用のメンバー関数が、デフォルトでコンパイラによってインライン関数と見なされることを確認したかっただけですか? もしそうなら、なぜそうなのか、この関数をインライン化するのではなく、(決して呼び出されないので) 完全に破棄しないのはなぜですか?
利点は何ですか?
更新問題は、呼び出されないのにインライン化するのはなぜですか? 未使用の変数が破棄されるのと同じように、単純に破棄しないでください。
VC++ で、呼び出されることのない未使用のメンバー関数が、デフォルトでコンパイラによってインライン関数と見なされることを確認したかっただけですか? もしそうなら、なぜそうなのか、この関数をインライン化するのではなく、(決して呼び出されないので) 完全に破棄しないのはなぜですか?
利点は何ですか?
更新問題は、呼び出されないのにインライン化するのはなぜですか? 未使用の変数が破棄されるのと同じように、単純に破棄しないでください。
メンバー関数はinline
、クラス定義の本体で定義されている場合、キーワードを使用しなくてもインラインと見なされます。呼ばれるか呼ばれないかは関係ありません。
未使用のメンバー関数は、その名前に外部リンケージがあるため、通常は破棄できません。つまり、他の翻訳単位または実行可能ファイルがそれらを呼び出す可能性があり、この翻訳単位またはこの実行可能ファイルがコンパイルされた時点でまだ書き込まれていません。リンクされています。
リンク時に到達すると、実装が何らかの形でこれが発生しないことを認識している場合、関数のコードを破棄できます。たとえば、OS には実行可能ファイル内のシンボルを検索する手段がないため、または実装定義のオプションを使用してリンカーにシンボルを削除するように指示したためです。
これを特に VC++ に関連付けると、Windows では、実行可能ファイル内のシンボルがdllexport
. したがって、これらの関数は通常、リンク時でも破棄されず、他の未使用の関数は、この TU が使用しないという理由だけでコンパイル時に破棄できません。メンバー関数を宣言するヘッダー ファイルとそれらを定義するソース ファイルを使用して通常の方法で定義されたほとんどのクラスでは、関数はそのソース ファイルでは使用されません。そのため、その TU で使用されていないという理由でコンパイラがそれらを破棄した場合、何も機能しません。
関数がインラインであるかどうかは、破棄できるかどうかに関連していると思いますが、完全に破棄できるとは限りません。それがインラインであり、誰かがそれを呼び出す場合、その誰かが自分の TU に関数の定義を持っている必要があるのは事実です。したがって、ある意味でその機能は「不要」です。ただし、static
どの TU から呼び出されるかに関係なく、ローカル変数を共有する必要があり、関数自体のアドレスは、それが取り込まれる TU に関係なく同じでなければなりません。関数の完全なコード。
しかし、私が言ったように、使用されていないときにインライン関数を破棄できるとしても、使用されていないすべての関数がインラインであるとは限りません。
どこにインライン化しますか?呼び出されることはないため、呼び出しサイトにインライン化することはできません。
標準は、関数がインラインと見なされるかどうかを義務付けています。呼ばれるかどうかは関係ありません。