コントロールから関数が終了すると、スタック領域が解放されることがわかります。静的変数の場合はどうなりますか。彼らは任意のメモリに保存され、関数が呼び出されると取得されますか?関数呼び出しごとに静的変数を取得する方法
答えて
wikiは言う:Cプログラミング言語で
を、静的を含むファイルに、その範囲を設定するために、グローバル変数 や関数で使用されます。ローカルの 変数では、静的に変数が自動的に割り当てられたメモリの代わりに割り当てられたメモリ に格納されます。 一方の言語が自動的に 割り当てられたメモリは、通常、一過性コールスタックとして実装されている間、静的に割り当てられたメモリは、典型的には、コンパイル時に番組のデータ セグメントに予約され、 メモリのいずれかのタイプの実装を決定しません。
と
静的ローカル変数:自動 ローカル変数と同じ範囲を有しながら機能 内部staticとして宣言された変数は、静的に割り当てられています。したがって、1つの呼び出しの間に関数が 静的ローカル変数に入れた値は、 関数が再び呼び出されたときにも存在します。
変数が*の変数が実行時に実行されているため、それらを保存して取得する必要があるという誤った前提がありました。
これは静的変数がスタック外のまったく異なるメモリセグメントに割り当てられているため、関数が自動変数の有効範囲を終了するときに解放されません。
通常、静的データセグメントは、プログラムに入ると一度作成され、初期化されます。その後、プログラムが実行されている間、セグメントは割り当てられたままになります。すべてのグローバル変数は、すべての関数の静的変数とともに、コンパイラによってこのセグメントに配置されます。そのため、関数の入力や終了はこれらの変数に影響しません。
*「スタック」の正式名称は「自動記憶領域」です。
以前に与えられた回答の上にいくつかのより多くの情報を追加 -
静的オブジェクト用のメモリをコンパイル/リンク時に割り当てられます。それらのアドレスは、リンカ制御ファイルに基づいてリンカによって固定されます。
リンカファイルは、物理メモリレイアウト(Flash/SRAM)と、異なるプログラム領域の配置を定義します。
実際には、静的領域は2つのセクションに分かれています.1つは初期値用で、もう1つは実行時に行われた変更です。
最後に、特に指定しない場合、値はコンパイル時に0に設定されることに注意してください。
この例を考えてみます。
static int foo;
void f(void)
{
static int bar;
}
はFOOとバー間の唯一の違いは、FOOがバー機能範囲を有し、一方、スコープファイルがあることです。両方の変数は、プログラムの全ライフタイム中に存在します。
- 1. 静的メンバー関数から非静的メンバー関数を呼び出す方法
- 2. 静的変数の関数を2回呼び出すか?
- 3. メンバー関数のように静的関数を呼び出す方法
- 4. Laravelのroutes.phpから静的関数を呼び出す方法
- 5. 10秒ごとにJS関数を呼び出す方法
- 6. "X"分ごとに関数を呼び出す方法は?
- 7. 関数ごとにmdiフォームを呼び出す方法
- 8. 2分ごとに関数を呼び出す方法
- 9. Angularで10秒ごとに関数を呼び出す方法
- 10. スレッドごとに関数を一度呼び出す方法
- 11. 静的子クラスで非静的関数を呼び出すPHP
- 12. 静的メソッドから静的関数ポインタを呼び出す
- 13. C#で数秒ごとに関数呼び出しを行う方法は?
- 14. 静的ライブラリの関数の呼び出しを防止する
- 15. 関数に関する情報を取得して呼び出す方法
- 16. 非同期静的関数を呼び出すときのSyntaxError
- 17. 目的関数CでJavaScript関数を呼び出す方法
- 18. Laravel - オブジェクトをインスタンス化せずに静的関数を呼び出す方法
- 19. LLVMで関数呼び出しの引数を取得する方法は?
- 20. 静的関数をメソッド名で呼び出しますか?
- 21. Cocos2dxスケジュールセレクタなしで5秒ごとに関数を呼び出す方法?
- 22. 非静的と呼ばれる静的関数の検出
- 23. 関数呼び出しで変数を渡す方法
- 24. 引数として呼び出される静的変数を持つ
- 25. C#で静的関数内で非静的関数を呼び出すことはできますか?
- 26. ナノ秒ごとに関数を呼び出しますか?
- 27. C#からのF#タイプ拡張(静的メンバー関数)の呼び出し方法
- 28. 参照変数を使用した静的メソッド呼び出し
- 29. ActionScriptオブジェクトの祖先クラスで静的関数を呼び出す方法は?
- 30. 他のソースファイルからmain.cppの静的関数を呼び出す方法は?
Rahulに感謝します。静的変数はコンパイル時に割り当てられたメモリを取得します。 –
言語によって実装が指定されていないことを強調してください。 – phoxis
@seereddisekharコンパイル時には実際には割り当てられません。実行ファイルを実行すると、ローダは実行可能ファイルに指定されているとおりにメモリ内の実行可能ファイルをペースします。したがって、ロード時に実際の割り当てが行われますが、仕様をコンパイルするときに相対アドレスとオフセットが定義されます。 – phoxis