c言語のstaticの使い方
http://tech.ddvip.com/2009-02/1234594734108774.htmlからの転載
一、cプログラム記憶空間レイアウト
Cプログラムはずっと下記の部分から構成されています.
1)本文段——CPUが実行するマシン命令部分.一つのプログラムはコピーしかありません.読み取り専用で、プログラムが思いがけない事故によって自身の命令を修正することを防止します.
2)データセグメント(データセグメント)を初期化する——初期値を付与したすべてのグローバル変数は、ここに保存されます.
3)非初期化データセグメント(bssセグメント)――プログラムで初期化されていないグローバル変数.カーネルはこのセグメントを0に初期化します.
4)スタック——成長方向:トップから下へ成長する;自動変数および関数の呼び出しごとに保存する必要がある情報(戻りアドレス、環境情報).
5)ヒープ——ダイナミックストレージ.
1.グローバル静的変数
グローバル変数の前にキーワードstaticを加えると、グローバル変数はグローバル静的変数として定義されます.
1)メモリ内の位置:静的記憶領域(静的記憶領域はプログラム全体の動作中に存在する)
2)初期化:初期化されていないグローバル静的変数は、プログラムによって自動的に0に初期化されます.
3)作用領域:グローバル静的変数は彼の文書を宣言する以外には見られない.正確に定義されているところからファイルの最後まで.
グローバル静的変数の利点を定義:
<1>他のファイルにアクセスされないように変更します.
<2>他のファイルで同じ名前の変数が使用されても、衝突しません.
2.局所静的変数
ローカル変数の前にキーワードstaticを加えると、局所変数は局所静的変数として定義されます.
1)メモリ内の位置:静的記憶領域
2)初期化:初期化されていないグローバル静的変数は、プログラムによって自動的に0に初期化されます.
3)スコープ:スコープは依然として局所的スコープであり、その関数またはステートメントブロックを定義すると、スコープは終了する.
注:ローカル変数を修飾するためにstaticを使用すると、ローカル変数の格納位置が変更され、元のスタックから静的記憶領域に保存されます.しかし、局部的な静的変数は作用領域を離れた後、破壊されずにメモリに残っています.プログラムが終了するまでは、彼を訪問することはできません.
グローバル変数を修飾するためにstaticを使用すると、グローバル変数のスコープが変更されます.
3.静的関数
関数の戻りタイプの前にキーワードstaticを加えると、関数は静的関数として定義されます.
関数の定義と宣言はデフォルトではexternですが、静的関数は彼を宣言するファイルの中でしか見られず、他のファイルでは使用できません.
静関数の利点を定義:
<1>他のファイルで同じ名前の関数を定義できます.衝突しないようにします.
<2>静的関数は他のファイルでは使用できません.
説明子aut、register、extern、staticを記憶し、対応する2つの記憶期間:自動記憶期間と静的記憶期間.
autとregisterは自動記憶期間に対応します.自動記憶期間を持つ変数は、その変数を宣言するプログラムブロックに入るときに確立され、このプログラムブロックの活動時に存在し、このプログラムブロックを終了するときにキャンセルされます.
キーワードのexternとstaticは、静的記憶期間を持つ変数と関数を説明するために用いられる.staticで宣言された局所変数は、静的記憶期間、または静的範囲を有する.彼の値は関数呼び出し間で有効に保たれているが、その名前の視認性はまだそのローカルドメインに制限されている.静的局部オブジェクトは、プログラムがオブジェクトの宣言に実行されるときに最初に初期化される.
拡張解析:
Stticという用語は、異常な歴史を持っています.最初に、Cにキーワードstaticを導入するのは、ブロックを終了した後もまだ存在するローカル変数を表すためです.その後、他のファイルにアクセスできないグローバル変数と関数を表すために、staticには第2の意味があります.新しいキーワードの導入を避けるために、staticキーワードを使ってこの第二の意味を表します.最後に
C+++は、このキーワードを再利用し、前とは異なる第3の意味を与える.このような特定のオブジェクトに属するのではなく、クラスに属する変数と関数を表す.
一、cプログラム記憶空間レイアウト
Cプログラムはずっと下記の部分から構成されています.
1)本文段——CPUが実行するマシン命令部分.一つのプログラムはコピーしかありません.読み取り専用で、プログラムが思いがけない事故によって自身の命令を修正することを防止します.
2)データセグメント(データセグメント)を初期化する——初期値を付与したすべてのグローバル変数は、ここに保存されます.
3)非初期化データセグメント(bssセグメント)――プログラムで初期化されていないグローバル変数.カーネルはこのセグメントを0に初期化します.
4)スタック——成長方向:トップから下へ成長する;自動変数および関数の呼び出しごとに保存する必要がある情報(戻りアドレス、環境情報).
5)ヒープ——ダイナミックストレージ.
|-----------|
| |
|-----------|
| |
|-----------|
| | |
| |/ |
| |
| |
| /| |
| | |
|-----------|
| |
|-----------|
| |
|-----------|
| |
|-----------|
| |
|-----------|
二、プロセス設計に向けたstatic1.グローバル静的変数
グローバル変数の前にキーワードstaticを加えると、グローバル変数はグローバル静的変数として定義されます.
1)メモリ内の位置:静的記憶領域(静的記憶領域はプログラム全体の動作中に存在する)
2)初期化:初期化されていないグローバル静的変数は、プログラムによって自動的に0に初期化されます.
3)作用領域:グローバル静的変数は彼の文書を宣言する以外には見られない.正確に定義されているところからファイルの最後まで.
グローバル静的変数の利点を定義:
<1>他のファイルにアクセスされないように変更します.
<2>他のファイルで同じ名前の変数が使用されても、衝突しません.
2.局所静的変数
ローカル変数の前にキーワードstaticを加えると、局所変数は局所静的変数として定義されます.
1)メモリ内の位置:静的記憶領域
2)初期化:初期化されていないグローバル静的変数は、プログラムによって自動的に0に初期化されます.
3)スコープ:スコープは依然として局所的スコープであり、その関数またはステートメントブロックを定義すると、スコープは終了する.
注:ローカル変数を修飾するためにstaticを使用すると、ローカル変数の格納位置が変更され、元のスタックから静的記憶領域に保存されます.しかし、局部的な静的変数は作用領域を離れた後、破壊されずにメモリに残っています.プログラムが終了するまでは、彼を訪問することはできません.
グローバル変数を修飾するためにstaticを使用すると、グローバル変数のスコープが変更されます.
3.静的関数
関数の戻りタイプの前にキーワードstaticを加えると、関数は静的関数として定義されます.
関数の定義と宣言はデフォルトではexternですが、静的関数は彼を宣言するファイルの中でしか見られず、他のファイルでは使用できません.
静関数の利点を定義:
<1>他のファイルで同じ名前の関数を定義できます.衝突しないようにします.
<2>静的関数は他のファイルでは使用できません.
説明子aut、register、extern、staticを記憶し、対応する2つの記憶期間:自動記憶期間と静的記憶期間.
autとregisterは自動記憶期間に対応します.自動記憶期間を持つ変数は、その変数を宣言するプログラムブロックに入るときに確立され、このプログラムブロックの活動時に存在し、このプログラムブロックを終了するときにキャンセルされます.
キーワードのexternとstaticは、静的記憶期間を持つ変数と関数を説明するために用いられる.staticで宣言された局所変数は、静的記憶期間、または静的範囲を有する.彼の値は関数呼び出し間で有効に保たれているが、その名前の視認性はまだそのローカルドメインに制限されている.静的局部オブジェクトは、プログラムがオブジェクトの宣言に実行されるときに最初に初期化される.
拡張解析:
Stticという用語は、異常な歴史を持っています.最初に、Cにキーワードstaticを導入するのは、ブロックを終了した後もまだ存在するローカル変数を表すためです.その後、他のファイルにアクセスできないグローバル変数と関数を表すために、staticには第2の意味があります.新しいキーワードの導入を避けるために、staticキーワードを使ってこの第二の意味を表します.最後に
C+++は、このキーワードを再利用し、前とは異なる第3の意味を与える.このような特定のオブジェクトに属するのではなく、クラスに属する変数と関数を表す.