変数の格納方式と生存期間(局所変数andグローバル変数)

3247 ワード

変数の格納方法と生存期間


C言語では、各変数と関数には、データ型とデータの格納カテゴリの2つの属性があります.データ型については、読者はすでに熟知している(整形、浮動小数点型など).ストレージカテゴリとは、静的ストレージや動的ストレージなどのデータのメモリへの格納方法を指します.

ローカル変数の格納カテゴリ


1.自動変数(auto変数)関数のローカル変数.static(静的)記憶タイプとして特別に宣言しない場合、記憶領域が動的に割り当てられ、データが動的記憶領域に格納される.関数のパラメータと、関数で定義されたローカル変数(一致文で定義されたローカル変数を含む)は、このタイプに属します.この関数を呼び出すと、これらの変数にストレージスペースが割り当てられ、関数呼び出しが終了すると自動的にこれらのストレージスペースが解放されます.したがって、これらの局所変数は自動変数と呼ばれます.自動変数はキーワードautoを格納カテゴリの宣言として使用します.例:
int f(int a)
{
   auto int b,c=3;
   ……
}

ここで、aはパラメータであり、bとcは自動変数であり、cに3を付与する.f関数を実行した後、a,b,cが占めるメモリセルを自動的に解放する.実際、キーワード「auto」は省略でき、autoを書かないと「自動記憶カテゴリ」として暗黙的に指定され、動的記憶方式に属する.プログラムのほとんどの変数は自動変数に属します.例:
int b,c=3;
 
auto int b,c=3;
 

2.静的ローカル変数(staticローカル変数)関数のローカル変数の値は、関数呼び出しが終了した後も消えずに元の値を保持し続けることが望ましい場合があります.すなわち、占有するメモリセルは解放されず、次回この関数を呼び出すと、その変数には値(前回呼び出しが終了した値)があります.この場合、このローカル変数を「静的ローカル変数」と指定し、キーワードstaticで宣言する必要があります.例:
int main()
{
  int fac(int n);
  int i;
  for(i=1;i<=5;i++)                        // 5 fac 
     printf("%d!=%d
"
,i,fac(i)); // i! return 0; } int fac(int n) { static int f=1; //f f=f*n; // f n return (f); // f n! }

3.レジスタ変数(register変数)一般的に、変数(静的記憶方式と動的記憶方式を含む)の値はメモリに格納され、プログラムでどの変数の値が使用されるかをコントローラから演算器に指令される.オペレータ演算を経て、メモリ数が必要な場合は、オペレータからメモリにデータを格納します.いくつかの変数が頻繁に使用されている場合(たとえば、1つの関数で10000回のループを実行し、ループごとにローカル変数を参照する)、変数の値にアクセスするのに多くの時間がかかります.実行効率を向上させるため、CPU内のレジスタに一定の値を置くことができ、必要に応じてレジスタから参加演算を直接取り出し、メモリから取り出す必要はありません.レジスタへのアクセス速度はメモリへのアクセス速度よりはるかに高いため、実行効率を向上させることができる.この変数をレジスタ変数と呼ぶ.キーワードregisterで宣言します.のように
register int f;    // f 

現在のコンピュータの速度がますます速くなり、性能がますます高くなるため、最適化されたコンパイルシステムは頻繁に使用される変数を識別することができ、プログラム設計者の指定を必要とせずにこれらの変数をレジスタに自動的に配置することができる.したがって,現在では実際にregisterで変数を宣言する必要性は大きくない.
以上から分かるように、3における局所変数の記憶位置は異なる:自動変数は動的記憶領域に記憶される;静的ローカル変数は静的記憶領域に格納される.レジスタはCPUのレジスタに格納される.