変数_(プログラミング)
[Wikipedia|▼Menu]
一方生存期間外にあるとき、そのアクセスは保証されない(未定義動作[7]あるいは禁止)。

生存期間という概念は記憶域すなわちメモリの確保・解放を可能にする。自動変数では生存期間の終了時にメモリが即時自動解放され、ガベージコレクションをサポートする言語あるいは環境では生存期間外にある変数のメモリがガベージコレクタによって事後的に自動解放される。逆にプログラム全体で値を保持し続ける必要がある静的変数では、実行全体にわたる生存期間の設定によりこれを可能にしている(例: グローバル変数)。

言語や規格によって呼称は異なる。一般的な別名として寿命、C言語およびC++では生存期間 (lifetime) や記憶域期間 (storage duration) [8]Common Lispではエクステント (extent) [9]C#では有効期間 (lifetime) [10]と呼ばれる。

変数のスコープはアクセス可能範囲に関する用語であり、メモリ割り当て保証範囲に関する生存期間とは別の概念である。例えばC/C++は静的ローカル変数をサポートし、関数内のローカル変数に記憶域クラス指定子static[11][12]を付けることで、その変数は静的記憶域期間を持つようになり、「スコープを脱出すると参照はできなくなるが、プログラムが終了するまでメモリ上に残り続ける変数」を定義できる。

変数の生存期間とは、プログラムの実行時に、その名前とそれが指すオブジェクトという対応付けが、いつ始まり、(再代入などが無い限り)いつまで保持されるか、ということである。

C言語における関数の仮引数や、自動記憶域期間を持つローカル変数(static修飾されていないローカル変数[注釈 1])の生存期間は、その関数を呼び出してから抜けるまでである。これは、C言語では関数呼び出しから一旦抜けてしまうと、そこに戻ってくることは無い(setjmp.h(英語版)内のsetjmp/longjmpを使えば不可能ではないが、「深い方」へのジャンプは禁止されている)からである。

生存期間は変数とその中身(オブジェクト[注釈 2])の対応付け (binding) についての概念である。クロージャなどの変数キャプチャにより、その変数へのアクセスがその後もあるかもしれない場合は、その関数呼び出しを抜けてもその対応付け(束縛、bindingなどとも)は保持されなければならない。クロージャないしそのようなものがある言語では、そのためにローカル変数でもエクステントは(アクセスされる可能性がある限り)延長される。そのようなエクステントをinfiniteあるいはindefiniteのエクステント(訳して、無限の、あるいは、無制限の存在期間、など)という。

なお、C言語の関数におけるローカル変数をstatic修飾すると、グローバル変数と同様の生存期間(静的記憶域期間)になる。一方、C言語のグローバル変数をstatic修飾すると、変数のスコープをファイルスコープに制限する(内部リンケージにする[注釈 3])。これは単にstaticという同一のキーワードを、文脈から区別が可能だから流用しているというだけで、それぞれの意味は全く違う(@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}後者はfilescopeといったような別の表現にするのが本来は適切だっただろう[独自研究?])。この流用が、おそらくスコープとエクステントを多くのプログラマが混同する原因の一つである[独自研究?][14]
脚注
注釈^ C17規格までのC言語およびC++03規格までのC++において、auto修飾されたローカル変数は自動記憶域期間を持つ自動変数になるが、ローカル変数は既定で自動変数となるため、autoキーワードは通例使われない。なおC++において、C++11規格以降はautoキーワードの意味が変更されており、型推論のプレースホルダーに使われる。C言語においても、C23規格以降はautoキーワードの意味が変更され、型推論のプレースホルダーに使われるようになる予定である[13]
^ いわゆるオブジェクト指向におけるオブジェクトではなく、プログラミング言語で値を表すものや、メモリ上にあるデータ(メモリオブジェクト)などといったものの総称である。
^ C言語のリンケージ指定の用法におけるstaticキーワードの対義語はexternキーワードである。グローバル変数や関数はデフォルトで外部リンケージであり、他のソースファイルからもそれらの「宣言」を記述するだけでアクセスできるようになるが、宣言をextern修飾することで外部リンケージであることを明確に示すこともできる。不完全型の外部リンケージ変数宣言の場合はextern修飾は必須ではないが、完全型の外部リンケージ変数宣言の場合は定義と区別するためにextern修飾が必須となる。externキーワードは通例ヘッダーファイルで前方宣言する際に使用される[11]

出典^ bit 編集部『bit 単語帳』共立出版、1990年8月15日、229頁。.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation.cs-ja1 q,.mw-parser-output .citation.cs-ja2 q{quotes:"「""」""『""』"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}ISBN 4-320-02526-1


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:28 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef