持続期間

提供: RAD Studio
移動先: 案内検索

宣言:インデックス への移動

持続期間(durarion)は,記憶クラスと密接な関係があり,宣言された識別子がメモリ内に割り付けられた実体のある物理的なオブジェクトを保持している期間を定義するものです。ここでは,コンパイル時オブジェクトと実行時オブジェクトは区別されます。たとえば変数は typedef 名やデータ型とは異なり,実行時に実メモリが割り当てられます。持続期間には,静的(static),ローカル(local),動的(dynamic)の 3 種類があります。

静的持続期間

静的持続期間を持つオブジェクトには,実行が開始されるとすぐにメモリが割り当てられ,割り当てられた記憶領域はプログラムが終了するまで維持されます。すべての関数は,どこで定義されたものであっても,静的持続期間を持つオブジェクトです。ファイルスコープを持つすべての変数は,静的持続期間を持ちます。ほかの変数に対しては static あるいは extern 記憶クラス指定子を明示的に用いることにより静的持続期間を与えることができます。

静的持続期間を持つオブジェクトは,明示的な初期化子がない場合,また C++ ではクラスコンストラクタがない場合は,ゼロ(あるいはヌル)に初期化されます。

静的持続期間を,ファイルスコープまたはグローバルスコープと混同してはいけません。静的持続期間とローカルスコープを持つオブジェクトもありえます。

ローカル持続期間

ローカル持続期間を持つオブジェクト(自動オブジェクト)は,たいへん不安定な存在です。これらは,封入ブロックあるいは関数に入ったときにスタック(あるいはレジスタ)上に作成され,そのブロックあるいは関数から出るときにその割り当てが解放されます。ローカル持続期間を持つオブジェクトは,明示的に初期化しなければなりません。そうしなければ,その内容は予想のつかないものになってしまいます。ローカル持続期間を持つオブジェクトは,必ずローカルスコープあるいは関数スコープを持ちます。ローカル持続期間の変数を宣言するときに記憶クラス指定子 auto を使用することができますが,ブロック内に宣言される変数のデフォルトは auto なので,普通は必要ありません。また,ローカル持続期間を持つオブジェクトは,封入ブロック外部には存在しないため,ローカルスコープを持ちます。ただし,この逆は真ではありません。ローカルスコープを持つオブジェクトが静的持続期間を持つこともありえます。

変数(たとえば,intcharfloat)の宣言において,記憶クラス指定子 register を指定すると,自動的に auto も指定したことになります。さらに,「可能であればオブジェクトにレジスタを割り当てること」という要求(あるいは指示)がコンパイラに渡されます。ローカルな整数変数あるいはポインタ変数にレジスタ(1 つでも空いていれば)を割り当てるように,コンパイラを設定することもできます。空いているレジスタがない場合には,変数は auto,すなわちローカルオブジェクトとして割り当てられます。このとき,警告やエラーは発生しません。

メモ:  コンパイラは,レジスタ割り当ての要求を無視することもあります。レジスタの割り当ては,変数がどのように使用されているかをコンパイラが解析した結果に基づきます。

動的持続期間

動的持続期間を持つオブジェクトは,プログラム実行中に特定の関数の呼び出しで生成され,消去されます。これらのオブジェクトの記憶領域は,malloc のような標準ライブラリ関数,あるいは C++ の演算子 new を用いることにより,ヒープと呼ばれる特殊な予約メモリ領域に割り当てられます。また記憶領域の解放には free あるいは delete を使います。

関連項目