Cの静的インライン関数は実行時にIDを持っていますか?
その構成の名前の競合を気にする必要がありますか?
関数が.c
ファイルで定義されている場合は? 同じですか?
Cの静的インライン関数は実行時にIDを持っていますか?
その構成の名前の競合を気にする必要がありますか?
関数が.c
ファイルで定義されている場合は? 同じですか?
インライン関数の命名は、非インライン関数の命名と同じくらい重要です。この名前は、呼び出す関数を識別するためにコンパイラによって使用されます。また、関数の動作を理解するためにコードを読むプログラマーによっても使用されます。
実行時には、関数の名前は関係ありません。
inline
また、キーワードはコンパイラへのヒントに過ぎないことにも注意してください。inline
キーワードにもかかわらず、関数は実際にはインライン展開されない場合があります。同様に、としてマークされていない関数はinline
、コンパイラによってインライン化される可能性があります。
インライン関数の名前の競合を気にしないかもしれませんが、コンパイラーが気にすることを保証します!
インライン化は、コンパイル中の後の段階の操作です。コンパイラは、最初にプログラムの呼び出し構造を決定する必要があります。これには、コンパイラがすべての名前付き呼び出しを正しく解決する必要があります。
実行時に、それを決定するための魔法を明示的にコーディングしない限り、現在実行中の関数の名前を知ることはできません - c
is not Reflective。
Mark が指摘しているように、inline キーワードはヒントにすぎません。明示的な呼び出しによってパフォーマンスが向上すると判断した場合、コンパイラはそれを自由に無視できます。
Cの静的インライン関数は実行時にIDを持っていますか?
静的インライン関数は、コンパイラが少なくとも 1 回インライン化しないことを選択した場合、または関数のアドレスを取得した場合、コンパイル単位内で ID を持ちます。
取得したアドレスは、現在のコンパイル単位 (.c
ファイル) でのみ有効です。別のコンパイル単位 (別の.c
ファイル) では、コンパイラは別のアドレスを提供します。
本体がコンパイラに表示される他の関数と同様に、関数のコードは、コンパイラによって生成されたアセンブリ コードのさまざまな場所で完全または部分的に複製される場合があります。
静的インライン関数 (静的関数と同様) は.c
、現在コンパイルされているファイル以外のファイルからは見えません.c
。
その構成の名前の競合を気にする必要がありますか?
ヘッダー ファイルで定義された静的インライン関数のアドレスを取得し、次の操作を行う場合のみ:
f
はファイルで定義されていますa.h
a.h
Cファイルに含まれてx.c
おり、y.c
x.c
のアドレスを受け取り、f
それをグローバル変数に格納しますf_addr
y.c
のアドレスをf
取得し、その ID を に格納されている値と比較しますf_addr
false
あるという事実にもかかわらず、比較の結果は になります。f
関数が .c ファイルで定義されている場合は? 同じですか?
C コンパイラの観点からは、ヘッダー ファイルで関数を定義し、ヘッダー ファイルを .c ファイルに含めることとまったく同じです。コンパイラはヘッダー ファイルについて何も認識せず、継続的なコンパイル ユニットを 1 つしか認識しません。ヘッダー ファイルは、C 言語を使用するプログラマーの頭の中に存在する概念です。この概念は、C コンパイラの観点からは存在しません。