编译器如何在编译时执行数据绑定?

How the compiler does data binding during compile time?

本文关键字:执行 数据绑定 编译 编译器      更新时间:2023-10-16

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

如果我在某处错了,请指导我

内存分配已知与堆栈基数的偏移量。在堆栈上分配变量时,会为该变量分配与堆栈基指针的偏移量。你也不关心这个指针的确切值 - 你只知道a位于地址[base pointer + 8],这允许您引用此函数中的a,除非您自己修改基本指针。

所以堆栈可能看起来像这样:

| Address |  Variable  |
|---------|------------|
| BP + 0  | a(4 bytes) |
| BP + 4  |   b (8 b)  |
| BP+4+8  |     c      |

请注意,偏移量可能是负数或正数,具体取决于堆栈顶部的位置。


以下是 Godbolt 的一个例子:

int main(void) {
char a = 22;
int b = 23;
return a + b;
}

在 ARM 上,编译器会将2223存储到a中,并像这样b,相对于堆栈指针(指向堆栈的顶部,而不是基指针(:

movw    r0, #22
strb    r0, [sp, #7]  ; `a` is at SP + 7
movw    r0, #23
str     r0, [sp]      ; `b` is at SP + 0

在 x86 上,偏移量将是负数,并且相对于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