它是如何在内存中使用指针和一般的?

时间:2012-12-24 06:31:24

标签: c++ pointers memory

假设我有一个指向 C ++ 中的int的指针。

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

myInt中,我有内存位置的信息来获取实际的整数值。我想myInt中的信息必须存储在内存中。

但编译器如何知道内存中myInt的位置?我想它必须将myInt的地址保留在内存中。但它在哪里保留最后的信息? Memoryinception

这更像是如何管理内存的一般性问题。

5 个答案:

答案 0 :(得分:3)

编译器知道myInt的位置,因为它将它放在首位。在编译期间,使用称为symbol table的数据结构来跟踪这些位置。编译代码只包含地址而不是变量名(或lexical names)。

答案 1 :(得分:1)

每个变量都有自己的内存地址,无论它包含什么。因此,当您存储指向整数的指针时,您只需存储指向变量数据的地址。该地址容器也有一个地址。您可以通过指向指针并显示令您满意的指标进行实验:

int i = 1;
int* pointer = &i;
cout << "address1:[" << &i << "] address2:[" << &pointer << "]\n";

答案 2 :(得分:0)

每个变量都有一个地址。

全局和静态变量相对于“loader”放置在内存中的整个模块进行寻址。 Loader读取“模块重定位表”,其中包含代码中的位置,应更正地址,并更正这些位置。 Google:与位置无关的代码。

自动变量(在函数体中声明)相对于激活记录进行寻址。每次调用函数时,都会在堆栈上推送激活记录,这是所有自动变量的“结构”。激活记录的地址存储在硬件寄存器中,用于处理每个变量。

答案 3 :(得分:0)

包括指针在内的所有局部变量都存储在堆栈中。编译代码使用堆栈指针rrlative寻址来访问它们。因此,您的第一个变量将位于0 + sp,第二个变量位于第一个变量+ sp等。

答案 4 :(得分:0)

i的实际地址以及myInt的实际地址直接嵌入到机器代码中,嵌入到访问i的实际机器命令和实际的机器命令中访问myInt

这些最终地址不存储在数据存储中。相反,它们直接嵌入到通过CPU的机器命令流中。它们被称为“即时操作数”。 CPU接收这些地址和实际的机器命令,因此CPU不必从数据存储器中的其他位置检索它们。

所以这就是这种看似“无限”的递归停止的方式。这就是它的最低点。

对于全局变量,在编译时知道确切地址并直接嵌入到机器命令中。对于局部变量,当前堆栈帧中的地址偏移量在编译时是已知的,并直接嵌入到机器命令中。