静的変数

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータプログラミングでは、静的変数は「静的に」割り当てられた変数ですつまり、その存続期間(または「範囲」)はプログラムの実行全体です。これは、ストレージがスタックに割り当てられ呼び出しスタックで割り当てが解除される、寿命の短い自動変数とは対照的です。ヒープメモリでストレージが動的に割り当てられ、割り当てが解除されるオブジェクトとは対照的です。

変数の有効期間はスコープ(変数を使用できる場合)とは対照的です。「グローバル」と「ローカル」は有効期間ではなくスコープを指しますが、スコープは多くの場合有効期間を意味します。多くの言語では、グローバル変数は常に静的ですが、一部の言語では動的ですが、ローカル変数は一般に自動ですが、静的な場合があります。

一般に、静的メモリ割り当ては、実行時に必要に応じてメモリが割り当てられる動的メモリ割り当て自動メモリ割り当てとは異なり、関連するプログラムが実行される前のコンパイル時[1]

歴史

静的変数は、少なくともALGOL 60(1960)までさかのぼります。ここでは、静的変数は独自の変数として知られています。

宣言には、独自の追加の宣言子を付けることができますこれには次の効果があります。ブロックに再入力すると、独自の数量の値は最後の終了時の値から変更されませんが、独自のマークが付いていない宣言された変数の値は未定義です。

—  ALGOL 60に関する改訂レポート、セクション「5.宣言」、p。14

この定義は静的変数とは微妙に異なります。これは動作を指定するだけであり、したがってストレージではなく存続期間を指定します。たとえば、プログラムのロード時ではなく、関数が最初に呼び出されたときに独自の変数を割り当てることができます。

これらの変数を参照するための静的という単語の使用は、少なくともBCPL(1966)にまでさかのぼり、 BCPLの影響を強く受けたCプログラミング言語によって普及しました。BCPLの定義は次のとおりです。

(1)静的データ項目:
プログラムの実行時間と同じ範囲でエクステントが持続するデータ項目。このようなデータ項目には、マニフェスト定数の左辺値があります。すべての静的データ項目は、関数またはルーチン定義、グローバル宣言、またはコロンで設定されたラベルのいずれかで宣言されている必要があります。

—  BCPLリファレンスマニュアル、7.2スペースの割り当てとデータ項目の範囲

BCPLは、ヒープ割り当てオブジェクトではなく、現在自動変数(ローカル、スタック割り当て)と呼ばれるものに対して「動的データ項目」を定義したことに注意してください。これは、動的割り当てという用語の現在の使用法です。

このstaticキーワードは、静的変数とその他の概念の両方でCおよび関連言語で使用されます。

アドレス指定

絶対アドレス アドレッシングモードは、静的変数でのみ使用できます。静的変数は、コンパイル時にコンパイラーが位置を認識している唯一の種類の変数であるためです。プログラム(実行可能ファイルまたはライブラリ)がメモリにロードされると、静的変数はプログラムのアドレス空間のデータセグメント(初期化されている場合)またはBSSセグメント(初期化されていない場合)に格納され、以前のオブジェクトファイルの対応するセクションに格納されます読み込みに。

スコープ

スコープとエクステントに関しては、静的変数にはプログラムの実行全体のエクステントがありますが、スコープがさらに制限される場合があります。基本的な違いは、グローバルスコープを持ち、したがってプログラム全体でコンテキストにある静的グローバル変数と、ローカルスコープを持つ静的ローカル変数との違いです。静的ローカル変数は、それが存在する関数が何度呼び出されても一度だけ初期化され、その値が保持され、宣言された関数への多くの呼び出しを通じてアクセスできるため、ローカル変数とは異なります。 、たとえば、カウント変数として使用されます。静的変数には、モジュールスコープまたはいくつかのバリアントが含まれる場合もあります。ファイルスコープまたはモジュールスコープの形式であるCの 内部リンケージ

Cの静的ローカル変数の例:

#include <stdio.h> 

void Func (){  
  static int x = 0 ;    
  // | x | | Func |の5回の呼び出しで1回だけ初期化されます そして、変数
//は、これらの呼び出しの後に5回インクリメントされます。| x |の最終値 // 5になります。x ++ ;  
  
  
  printf "%d \ n " x ); // | x |の値を出力します }   


int main (){  
  Func (); // 1つのFunc ();を出力します // 2 Func ();を出力します // 3 Func ();を出力します // 4 Func ();を出力します // 5を出力します  
    
    
    
    

  0を返す; 
}

オブジェクト指向プログラミング

オブジェクト指向プログラミングでは、静的に定義されたクラスのクラス変数」である静的メンバー変数、つまり、すべてのインスタンス(オブジェクト)間で共有される特定のクラスのメンバー変数の概念もあり ますこれらのオブジェクトのメンバー変数としてアクセスできます。動的に定義されたクラスのクラス変数は、実行時にクラスを定義できる言語で、クラスが定義されたときに割り当てられ、静的ではありません。

文字列リテラルなど、コンパイル時に既知のオブジェクト定数は、通常、静的に割り当てられます。オブジェクト指向プログラミングでは、クラスの仮想メソッドテーブルは通常静的に割り当てられます。静的に定義された値は、そのスコープ内でグローバルにすることもでき、一貫性を保つために実行全体で 同じ不変の値が使用されるようにします。

も参照してください

メモ

  1. ^ ジャックロンズ。「静的メモリ割り当てと動的メモリ割り当てとは何ですか?」MeritHub [キャリア開発研究所] 2011年6月16日取得コンパイラは、宣言された変数に必要なメモリスペースを割り当てます。addressof演算子を使用すると、予約済みアドレスが取得され、このアドレスをポインター変数に割り当てることができます。宣言された変数のほとんどには静的メモリがあるため、ポインタ値をポインタ変数に割り当てるこの方法は、静的メモリ割り当てと呼ばれます。メモリはコンパイル時に割り当てられます。

参考文献