0

C++のintへのポインタがあるとしましょう。

int i = 1;
int* myInt = &i;

にはmyInt、実際の整数値を取得するためのメモリ位置の情報があります。myIntの情報はメモリに保存する必要があると思います。

しかし、コンパイラはどのようにしmyIntてメモリのどこにあるかを知るのでしょうか?myIntのアドレスをメモリに保持する必要があると思います。しかし、それはその最後の情報をどこに保持しますか?Memoryinception

これは、メモリをどのように管理するかという一般的な質問に似ています。

4

5 に答える 5

3

コンパイラは、最初に myInt を配置するため、myInt がどこにあるかを認識しています。コンパイル中に、シンボル テーブルと呼ばれるデータ構造を使用して、これらの場所を追跡します。コンパイル コードにはアドレスのみが含まれ、変数名 (または語彙名) は含まれません。

于 2012-12-24T06:38:43.377 に答える
1

すべての変数には、その内容に関係なく、独自のメモリ アドレスがあります。したがって、整数へのポインターを格納する場合は、変数のデータを指すアドレスを格納しているだけです。このアドレス コンテナにもアドレスがあります。ポインターへのポインターを作成し、それらを満足のいくように表示することで実験できます。

int i = 1;
int* pointer = &i;
cout << "address1:[" << &i << "] address2:[" << &pointer << "]\n";
于 2012-12-24T06:35:37.963 に答える
0

すべての変数にはアドレスがあります。

グローバル変数と静的変数は、「ローダー」によってメモリに配置されたモジュール全体に対して相対的にアドレス指定されます。ローダーは、アドレスを修正する必要があるコード内の場所を含む「モジュール再配置テーブル」を読み取り、これらの場所を修正します。グーグル:位置独立コードも。

自動変数(関数本体で宣言されている)は、アクティベーションレコードに関連してアドレス指定されます。関数が呼び出されるたびに、アクティブ化レコードがスタックにプッシュされます。これは、すべての自動変数の「構造」です。アクティベーションレコードのアドレスは、各変数のアドレス指定に使用されるハードウェアレジスタに格納されます。

于 2012-12-24T07:12:30.730 に答える
0

の実際のアドレスと のi実際のアドレスは、マシン コード、 にアクセスする実際のマシン コマンド、および にmyIntアクセスする実際のマシン コマンドに直接埋め込まれます。imyInt

これらの最終アドレスは、データ ストレージには保存されません。代わりに、CPU を通過するマシン コマンドのフローに直接組み込まれます。それらは「即値オペランド」と呼ばれます。CPU はこれらのアドレスを実際のマシン コマンドと一緒に受信するため、CPU はデータ メモリ内の他の場所からアドレスを取得する必要はありません。

これが、この一見「無限」の再帰が停止する方法です。こんな感じで底がつきます。

グローバル変数の場合、正確なアドレスはコンパイル時に認識され、マシン コマンドに直接組み込まれます。ローカル変数の場合、現在のスタック フレームのアドレス オフセットはコンパイル時に認識され、マシン コマンドに直接組み込まれます。

于 2012-12-24T07:51:11.547 に答える