对于此代码:
int main(void) {
int a = 1;
int b = 2;
int* pa = &a;
*pa = a + b;
printf("%d", a);
}
在编译时,编译器计算它需要多少空间。我们有 2 个整数和 1 个指针。所以它是2*4 + 8 = 16
。然后它指定给定变量的内存相对于起始点地址的位置。
pa
位于起点地址,长度为 8 个字节。
b
位于起点地址 + 8 个字节,长度为 4 个字节。
a
位于起点地址 + 12 个字节,长度为 4 个字节。
然后 go 指令执行时间:
- 要求操作系统分配 16 个字节并提供内存中该空间的地址。这将是起点地址。
- 将 的二进制表示
1
放在 的位置a
。 - 将 的二进制表示
2
放在 的位置b
。 a
将(起点地址 + 12 字节)的相对地址转换为其绝对位置,并将其放在pa
.- 获取 location
a
处的字节和 location 处的字节b
,添加它们,然后获取 location 处的字节pa
。使用位置的字节pa
作为地址并将计算的总和放在那里。 - 打印位置处的字节,
a
首先将它们转换为十进制数。 - 释放内存并让操作系统知道该程序已完成。
这是一个有效的翻译吗?
编辑:
假设使用了一个超级简单的编译器(没有优化)。它只关心 C 代码的有效执行。