C++ 编译器如何在编译时进行数据绑定?
编译器绑定正在将变量名替换为它们的地址。 分配给b的内存量在编译时决定。。但它是在运行时分配的,这意味着直到运行时才知道变量和函数的地址。。 若内存位置未知…那个么编译器如何在编译期间将名称转换为地址C++ 编译器如何在编译时进行数据绑定?,c++,data-structures,C++,Data Structures,编译器绑定正在将变量名替换为它们的地址。 分配给b的内存量在编译时决定。。但它是在运行时分配的,这意味着直到运行时才知道变量和函数的地址。。 若内存位置未知…那个么编译器如何在编译期间将名称转换为地址 如果我在某个地方出错,请指导我,内存分配是根据堆栈基的偏移量来确定的。当您在堆栈上分配变量时,您将为该变量分配一个与堆栈基指针的偏移量。您也不关心此指针的确切值-您只知道a位于地址[基本指针+8],这使您可以在该函数中引用a,除非您自己修改基本指针 因此,堆栈可能如下所示: | Address |
如果我在某个地方出错,请指导我,内存分配是根据堆栈基的偏移量来确定的。当您在堆栈上分配变量时,您将为该变量分配一个与堆栈基指针的偏移量。您也不关心此指针的确切值-您只知道
a
位于地址[基本指针+8]
,这使您可以在该函数中引用a
,除非您自己修改基本指针
因此,堆栈可能如下所示:
| Address | Variable |
|---------|------------|
| BP + 0 | a(4 bytes) |
| BP + 4 | b (8 b) |
| BP+4+8 | c |
请注意,偏移可能为负或正,具体取决于
下面是一个例子: 在ARM上,编译器将
22
和23
存储到a
和b
中,如下所示,相对于堆栈指针(指向堆栈顶部,而不是基指针):
在x86上,偏移量将为负值,并且相对于rbp
-基本指针:
movw r0, #22
strb r0, [sp, #7] ; `a` is at SP + 7
movw r0, #23
str r0, [sp] ; `b` is at SP + 0
mov byte ptr [rbp - 5], 22 ; a (1 byte) is at BP - 5
mov dword ptr [rbp - 12], 23 ; b (4 bytes) is at BP - 12
具有自动存储持续时间的变量在堆栈上分配(如果没有优化到寄存器)。它们的地址相对地从堆栈寄存器派生。只要学习堆栈是如何工作的。(技术上,C++程序可以在无栈机器上运行,但是现在,所有主流处理器体系结构都使用栈)。考虑“代码> > <代码>堆栈,其地址是代码> dWord PTR [RBP4] < /C>,其中代码> RBP 是堆栈基登记器。
mov byte ptr [rbp - 5], 22 ; a (1 byte) is at BP - 5
mov dword ptr [rbp - 12], 23 ; b (4 bytes) is at BP - 12