経験豊富な C 開発者から、静的変数の概念は静的メモリ割り当ての概念と同じではないと言われました。これは正しいです?もしそうなら、2つの概念の違いは何ですか?
静的メモリ割り当ての正式な定義は何ですか?また、静的変数の正式な定義とどのように違うのですか?
この質問は、これらの概念が C プログラミング言語のみにどのように対応するかについて言及しています。
経験豊富な C 開発者から、静的変数の概念は静的メモリ割り当ての概念と同じではないと言われました。これは正しいです?もしそうなら、2つの概念の違いは何ですか?
静的メモリ割り当ての正式な定義は何ですか?また、静的変数の正式な定義とどのように違うのですか?
この質問は、これらの概念が C プログラミング言語のみにどのように対応するかについて言及しています。
基本的に、静的変数は、静的メモリ割り当てを使用してメモリが割り当てられる変数です。
これは、次の用語の使用によってサポートされています。
GNU のlibc マニュアル。
- 静的割り当ては、静的変数またはグローバル変数を宣言するときに発生します。各静的変数またはグローバル変数は、固定サイズのスペースの 1 つのブロックを定義します。この領域は、プログラムの開始時 (exec 操作の一部) に一度割り当てられ、解放されることはありません。
- 関数の引数やローカル変数などの自動変数を宣言すると、自動割り当てが発生します。自動変数のスペースは、宣言を含む複合ステートメントに入ると割り当てられ、その複合ステートメントを終了すると解放されます。GNU C では、自動ストレージのサイズはさまざまな式にすることができます。他の C 実装では、定数でなければなりません。
K&R 第 2 版、付録 A、セクション 4.1「ストレージ クラス」
自動と静的の 2 つのストレージ クラスがあります。いくつかのキーワードは、オブジェクトの宣言のコンテキストと共に、そのストレージ クラスを指定します。自動オブジェクトはブロック (Par.9.3) に対してローカルであり、ブロックから出ると破棄されます。ストレージ クラスの指定が指定されていない場合、または auto 指定子が使用されている場合、ブロック内の宣言は自動オブジェクトを作成します。register 宣言されたオブジェクトは自動で、(可能であれば) マシンの高速レジスタに格納されます。
静的オブジェクトは、ブロックのローカルまたはすべてのブロックの外部にある場合がありますが、いずれの場合も、関数およびブロックから出て再入する間、それらの値を保持します。関数のコードを提供するブロックを含むブロック内で、静的オブジェクトは static キーワードで宣言されます。関数定義と同じレベルで、すべてのブロックの外側で宣言されたオブジェクトは、常に静的です。static キーワードを使用して、特定の翻訳単位に対してローカルにすることができます。これにより、それらに内部リンケージが与えられます。それらは、明示的なストレージ クラスを省略するか、キーワード extern を使用することによって、プログラム全体に対してグローバルになります。これにより、外部リンケージが提供されます。
これにより、同等性が確認されたようです。
コンパイラ、原理、技法、およびツールセクション 7.1.1 静的ストレージ割り当てと動的ストレージ割り当て
staticとdynamicという 2 つの形容詞は、コンパイル時と実行時をそれぞれ区別します。
オペレーティング システム、概念ベースのアプローチDM Dhamdhere、194 ページ
定義 5.1 (静的バインディングと動的バインディング)静的バインディングは、プログラム (またはソフトウェア システム) の動作が開始される前に実行されるバインディングであり、動的バインディングは、その動作中に実行されるバインディングです。
[...]
静的メモリ割り当てと動的メモリ割り当て静的メモリ割り当ては、コンパイラ、リンカ、またはローダによって実行用のプログラムの読み取り中に実行できます。動的メモリ割り当ては、遅延方式で実行されます。つまり、メモリ割り当ては、プログラムの実行中にエンティティが初めて使用される直前にエンティティに割り当てられます。
[...]
静的メモリ割り当てでは、プログラムの実行中にメモリ割り当てアクションは必要ありません。対照的に、動的割り当てでは、プログラムの実行中に実行されるメモリ割り当てアクションのオーバーヘッドが発生します。これらのアクションの中には、プログラムの実行中に数回繰り返されるものもあります。
C でのプログラミング - Ajay Mittal による実用的なアプローチ。セクション 7.7、概念的な質問と回答、いいえ 25 ページ 444
実行時 (つまり、プログラムの実行時) のメモリ割り当ては、動的メモリ割り当てと呼ばれます。
malloc
C では、 、calloc
またはrealloc
関数を呼び出すことにより、メモリを動的に割り当てることができます。コンパイル時のメモリ割り当ては、静的メモリ割り当てと呼ばれます。
これに続いて、違いをより詳細に説明する表が続きます。グーグルブックスで見れます
C および C++ のプログラミング概念としてのメモリ15 ページ:
[...]したがって、厳密に言えば、プログラムの実行時にコンパイラはメモリを割り当てませんが、静的メモリ割り当てまたは(コンパイル時のメモリ割り当てまたはコンパイラによるメモリ割り当て)について話します。プログラムの実行時に、プログラムのコンパイルに使用されたコンパイラが存在しなくなっている場合もあります。
ウィキペディアは、静的メモリ割り当てと静的変数の 2 つの概念が同等であることを確認しています。静的メモリ割り当てと静的変数は互いに参照し、静的変数は静的に割り当てられた変数であると明示的に述べています。