我正在使用C ++(对不起,如果我的问题有点令人困惑)。我知道指针如何工作。它指向一个变量的地址。 我的问题是,如果我在堆栈或堆中创建了一个简单的变量(不是指针)。CPU如何找到变量的地址,因为没有指向该变量的指针。它只是一个名称内存中的地址。 例如
int main()
{
int a=5;//Created a variable by allocating 4 bytes
return 0;
}
它创建了一个变量,但问题是CPU如何找到变量?
答案 0 :(得分:2)
似乎你有一些概念上的误解。在每个程序中,都有一个名为 stack 的内存区域,其中分配了局部变量。在大多数计算机体系结构中,有一个名为堆栈指针的寄存器(x86_64架构中的 rsp ),它指向堆栈的顶部(从较高的内存地址增长到较低的内存地址)地址)。
在执行时,程序代码(由编译器而不是OS生成)使用此堆栈指针作为分配其局部变量的基础。所以你的代码会将数字5 本身移动到调用main()
时指向堆栈指针当前值的位置,偏移量为4个字节(位置)当前sp寄存器指向的根本不知道,因为它随着每个函数调用一直在变化。)
答案 1 :(得分:0)
CPU如何找到变量的地址,因为没有指向该变量的指针。它只是内存中地址的名称。
事实并非如此。事实上,它与真实相反。
在您的可执行文件中,您的编译器已经编写了变量的地址(或者当前堆栈帧的相对偏移量)以及描述如何使用它的机器指令。该名称根本不存在。
这就是你的CPU如何知道如何找到变量:变量在运行时不再存在!它是C ++的抽象,为您提供程序员,让您的生活更轻松。但它与实际计算机程序实际的工作方式以及CPU如何执行它几乎没有任何关系。