Cでは、グローバル変数はプログラムコードと共に格納されます。つまりそれらを保持するスペース オブジェクトファイルの一部 (データまたはbssセクションのいずれかで)、実行中に(スタックまたはヒープに)割り当てられるのではなく。
言語がグローバル変数を格納するために他にどのような方法を使用していますか?たとえば、Pythonのような動的言語について考えてみます。 Lispのような再帰言語についてはどうですか?クラス志向が関係するのでしょうか? 「新しい」言語は(後知恵を利用して)異なるアプローチをとりますか?
Cがコードとともにその場でグローバル変数を格納することによって得られる実質的な利点はありますか?
いいえ、グローバル変数は必ずしもコードとともに格納されるとは限りません。
C標準では、グローバル変数を静的ストレージ期間として定義しています(静的ストレージ期間は、そのサブセットである静的変数と混同しないでください)。グローバル変数が実行可能ファイルに事前に割り当てられることは保証されませんが、それだけが保証されます。
6.2.4/3:(...)その存続期間は、プログラムの実行全体とその保存された値ですは、プログラムの起動前に一度だけ初期化されます。
したがって、プログラムの起動前に行われる限り、準拠Cの実装は、実行時にグローバル変数を完全に割り当てて初期化できます。
ちなみに、プログラムの起動は、オペレーティングシステムによる実行可能プロセスの開始ではありません。 C標準は、それが何であるかをここで説明します:
5.1.2/1:(...)プログラムの起動は、指定されたC関数が実行環境から呼び出されたときに発生します。静的な保存期間を持つすべてのオブジェクトは、プログラムの起動前に初期化(初期値に設定)されます。 そのような初期化の方法とタイミングは、その他の点では指定されていません。
ただし、多くのC言語の実装は、説明したとおりに動作することは事実です。しかし、これはCに固有のものではありません。これは、多くのオペレーティングシステムで提供される機能の使用に関連しています。これにより、事前に初期化されたデータをロードする 実行可能ファイルのデータセグメント を定義できます。そのアドレスは、実行可能ファイルが生成されたときにリンカによって解決されます(最終的にはローダーによって再配置されます)。