编译器如何在编译时执行数据绑定?
How the compiler does data binding during compile time?
>编译器绑定正在将变量名称替换为它们的地址。 分配给 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 上,编译器会将22
和23
存储到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
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 编译器如何在编译时执行数据绑定?
- 学生信息的数据绑定
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 为什么VAO可以使用VBO数据绑定它?
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- | 9 |错误:非静态数据成员'matrix :: row'| 9 |错误:数组绑定不是在']']'令牌|之前的整数常数
- 结构绑定:与公共数据成员(继承的基类)结合
- 使用 sqlite3 和 C++ 绑定和返回文本数据
- 绑定数据成员在VS2012中不起作用
- DDX 数据绑定与 Windows 窗体找不到类方法
- 代码合成XSD解析/数据绑定xml字符串,而不是xml文件
- 对C++中的异常机制执行动态绑定规则
- 请帮助我检查Silverlight for Windows Embedded中有关数据绑定的代码
- XML数据绑定-可以自动完成读/写功能
- c++中的XML数据绑定,具有简单的非侵入性数据模型
- C++的XML数据绑定,类似于java的JAXB
- Windows 8 APP,用数据绑定改变XAML文本框的文本.游戏循环工作线程导致问题
- 数据绑定- XML数据绑定和c++代码生成器