web-dev-qa-db-ja.com

グローバル変数とローカル変数のメモリ使用量

私はCコーディングの初心者です。変数をさまざまな関数で使用する必要があるCコードを書いています。グローバル変数を使用して関数を介して操作するか、ローカル変数として宣言して関数から関数に引数として渡すかを尋ねたいのですが。

私の理解では、グローバル変数として宣言すると、同じメモリ空間が異なる関数によって使用されますが、ローカルとして使用すると、関数が呼び出されるたびに定義および宣言されるため、より多くのメモリが使用されます。これは本当ですか?

2
T.Mali

まず、「定義」と「宣言」は、実行時ではなくソースコードで行うことです。変数の宣言と定義には、実行される実際のマシンコードに対応するものとそうでないものがあります。私の知る限り、追加の関数パラメーターまたはローカル変数の定義は追加のマシンコードを生成せず、関数呼び出しの一部としてCPUのフレーム/スタック/ etcポインターが移動するバイト数を変更するだけです。

真実とは、関数パラメーターのメモリは、その関数を呼び出すたびに(前述のポインターが移動されることによって)スタックに割り当てられるのに対し、グローバル変数のメモリは一度だけ割り当てられるということです。その意味であなたは絶対的に正しいです。ただし、これらの関数呼び出しによって割り当てられたメモリは、関数が終了するとすぐに割り当て解除されますが、グローバル変数のメモリはプログラム全体の長さを維持する必要があります。その意味で、「より多くのメモリが使用される」というのは実際には正しくありません。

もちろん、これは、グローバル変数を使用するのは非常に愚かな理由です。メモリ使用量またはランタイムパフォーマンスの変更は非常に小さいか、またはまったく存在しませんが、必要のないグローバル変数を追加すると、通常、プログラムははるかに脆弱になり、長期的にはテストできなくなります(詳細については なぜグローバル状態が悪か を参照してください)。グローバル変数の「最適化」が実際にはローカル変数よりも大きなパフォーマンスの向上であることを示すプロファイリングツールからのハードデータがない限り、絶対に実行しないでください。

3
Ixrec