ストレージバインディング/生存期間
3050 ワード
前編ではバインディングのタイプバインドについて述べた.この記憶バインディングについては、プログラム設計言語の根本的な特徴は、この言語の変数記憶バインディングの設計方式に依存する.変数名とメモリセルとの間の関連付けられたこのプロセスは、記憶バインディング、または記憶空間割り当てと呼ばれる.変数名がメモリセルの解除にバインドされるこのプロセスをメモリ空間解除バインドと呼ぶ.変数の生存期間とは、変数名がある記憶アドレスにバインドされた時間を指す.あるいは、1つの変数名が、ある記憶アドレスとバインドからバインド解除までの期間である.このことから,変数の生存期間はストレージバインディングと密接に関連していることが分かる.一般に、変数の格納バインディングを解析するために、変数の生存期間に応じて4つのタイプに分けられます.静的変数(静的割当て)スタック動的変数(スタック割当て)表示スタック動的変数(スタック割当て)暗黙的スタック動的変数(スタック割当て)も、静的変数、スタック変数、スタック変数の3つに大まかに分けることがあります.一、静的変数静的変数とは、プログラムの実行前にあるメモリセルにバインドされ、プログラムの実行が終了するまで変わらない変数を指す.グローバル変数は静的割当ての最も典型的な例であり、数値と文字列も静的割当てである.また、多くのコンパイラでは、エラー、ダイナミックタイプチェック、ゴミ収集、例外処理など、実行時のさまざまなサポートルーチンのためのさまざまなテーブルも生成されます.これらのテーブルも静的に割り当てられています.静的割り当ての半分は、保護された読み取り専用ストレージ領域にあり、不注意で書き換えをしようとすると、プロセッサが中断します.静的割当ての利点:1、グローバル変数は、プログラムが実行するプロセス全体によく使用されるため、同じストレージスペースにバインドされます.2、サブルーチンで宣言された変数を履歴に敏感にする.3、効率的で、静的な分配はすべて直接アドレスすることができて、その他のタイプの変数はしばしば間接アドレスです.間接アドレス速度が遅い.また、静的割当てには、実行時割当てと割当て解除に必要なオーバーヘッド静的割当てがないという欠点があります.1、静的ストレージバインドのみの言語でサブプログラム再帰がサポートされていないなど、柔軟性が悪いという欠点があります.2、変数間ではストレージスペースを共有できません.C/C++では、定義された変数が静的になるように、関数内の変数定義にstatic修飾子を使用できます.ただしstatic修飾子がC+/Java/C#のクラス定義の変数に作用する場合は静的変数ではなく、クラス変数です.同じ予約字の多くの用途が、特に初心者にとって混同される可能性があることがわかります.二、スタック動的変数スタック動的割当てとは、それらの宣言文を決定すると、ストレージバインディングが生成されるが、それらのタイプは静的バインディングである(JSでは例外であり、そのタイプも動的バインディングである).このバインド・プロシージャは、宣言文に添付されたコードにプログラムが実行されると、スタックの動的割り当てが実行時に発生し、その記憶領域が実行時のスタックである.C++/Java/C#でメソッド内で宣言された変数はスタックダイナミックです.一方、Adaでサブプログラムに定義されているすべての非スタック変数はスタック動的である.スタックの動的割り当ての利点:1、柔軟性がよく、サブプログラムの再帰をサポートする2、変数間で記憶空間スタックの動的割り当てを共有できる欠点:効率が低く、間接アドレスと実行時に割り当てを解除する必要がある3、スタックの動的変数スタックを表示することは、不規則を使用し、組織的に高度にばらばらな記憶ユニットを指す.表示スタック動的変数は、new,deleteなどのプログラム担当者が特定の命令を指定して割り当てと割り当て解除を行う記憶ユニットである.これらのスタックから割り当てられ、割り当てが解除された変数は、ポインタまたは参照変数のみで参照できます.ヒープ動的変数を表示するには、それに関連付けられた2つの変数ポインタ/参照があります.ヒープ動的変数ヒープ動的変数自体にアクセスできるのは、ヒープ動的変数ヒープ動的変数自体です.Nの複数の基本タイプ変数からなる値自体などです.
newオペレータを使用してストレージ割り当てを行い、実行後、スタック動的変数自体にアクセスできるスタック動的変数への参照を返します.のように
deleteオペレータを使用してストレージ割り当てを解除し、deleteを実行するとストレージ割り当てを解除します.C++は表示の解除を要求し、Java/JavaScriptは不要であり、ゴミ回収メカニズムを採用している.C#にはスタック動的割当てとスタック動的割当ての両方が暗黙的に割り当て解除されます.スタックのダイナミック変数の利点を表示します.チェーンテーブル、ツリーなどのダイナミック構造でよく使用されます.これらの構造は運転中に成長または収縮する必要がある.ポインタや参照、表示スタックの動的変数を使用することで、このような構造を容易に構築することができます.スタックの動的変数の欠点を表示します:1、ポインタ変数や参照変数を正しく使用するのは難しいです.2、分配及び解除に必要な代価3、記憶管理上の複雑性4、暗黙的スタック動的変数暗黙的スタック動的変数は、それらが付与されたときにスタック記憶空間にバインドされることを指す.実際には、値を割り当てるたびにバインドされます.JavaScriptなど
aryが以前に定義されて使用されたかどうかにかかわらず、現在は2つの値を持つ配列です.暗黙的なスタック動的変数の利点:極めて汎用的なプログラムの作成を可能にする柔軟性が高い.暗黙的なスタックの動的変数の欠点:1、効率が低く、実行時にすべての動的属性を維持する追加のオーバーヘッド2、コンパイラがいくつかのエラーチェックを漏らす3、ストレージ管理の複雑さ
// java
Person p1 = new Person("name");
// js
var p1 = new Person('name');
newオペレータを使用してストレージ割り当てを行い、実行後、スタック動的変数自体にアクセスできるスタック動的変数への参照を返します.のように
int *inode;
inode = new int;
delete inode;
deleteオペレータを使用してストレージ割り当てを解除し、deleteを実行するとストレージ割り当てを解除します.C++は表示の解除を要求し、Java/JavaScriptは不要であり、ゴミ回収メカニズムを採用している.C#にはスタック動的割当てとスタック動的割当ての両方が暗黙的に割り当て解除されます.スタックのダイナミック変数の利点を表示します.チェーンテーブル、ツリーなどのダイナミック構造でよく使用されます.これらの構造は運転中に成長または収縮する必要がある.ポインタや参照、表示スタックの動的変数を使用することで、このような構造を容易に構築することができます.スタックの動的変数の欠点を表示します:1、ポインタ変数や参照変数を正しく使用するのは難しいです.2、分配及び解除に必要な代価3、記憶管理上の複雑性4、暗黙的スタック動的変数暗黙的スタック動的変数は、それらが付与されたときにスタック記憶空間にバインドされることを指す.実際には、値を割り当てるたびにバインドされます.JavaScriptなど
ary = [33,55];
aryが以前に定義されて使用されたかどうかにかかわらず、現在は2つの値を持つ配列です.暗黙的なスタック動的変数の利点:極めて汎用的なプログラムの作成を可能にする柔軟性が高い.暗黙的なスタックの動的変数の欠点:1、効率が低く、実行時にすべての動的属性を維持する追加のオーバーヘッド2、コンパイラがいくつかのエラーチェックを漏らす3、ストレージ管理の複雑さ