Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何在编译时进行数据绑定?_C++_Data Structures - Fatal编程技术网

C++ 编译器如何在编译时进行数据绑定?

C++ 编译器如何在编译时进行数据绑定?,c++,data-structures,C++,Data Structures,编译器绑定正在将变量名替换为它们的地址。 分配给b的内存量在编译时决定。。但它是在运行时分配的,这意味着直到运行时才知道变量和函数的地址。。 若内存位置未知…那个么编译器如何在编译期间将名称转换为地址 如果我在某个地方出错,请指导我,内存分配是根据堆栈基的偏移量来确定的。当您在堆栈上分配变量时,您将为该变量分配一个与堆栈基指针的偏移量。您也不关心此指针的确切值-您只知道a位于地址[基本指针+8],这使您可以在该函数中引用a,除非您自己修改基本指针 因此,堆栈可能如下所示: | Address |

编译器绑定正在将变量名替换为它们的地址。 分配给b的内存量在编译时决定。。但它是在运行时分配的,这意味着直到运行时才知道变量和函数的地址。。 若内存位置未知…那个么编译器如何在编译期间将名称转换为地址


如果我在某个地方出错,请指导我,内存分配是根据堆栈基的偏移量来确定的。当您在堆栈上分配变量时,您将为该变量分配一个与堆栈基指针的偏移量。您也不关心此指针的确切值-您只知道
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