对于这段代码:
int main(void) {
int a = 1;
int b = 2;
int* pa = &a;
*pa = a + b;
printf("%d", a);
}
在编译时,编译器会计算它需要多少空间。我们有 2 个整数和一个指针。所以它是 2*4 + 8 = 16
。然后它指定给定变量的内存相对于起始点地址的位置。
pa
是起始地址,长度为8字节。
b
位于起始地址 + 8 个字节,长度为 4 个字节。
a
在起点地址+12字节,长度为4字节。
然后去指令执行时间:
- 要求操作系统分配 16 个字节并为内存中的该空间提供地址。这将是起点地址。
- 将
1
的二进制表示放在a
的位置。 - 将
2
的二进制表示放在b
的位置。 - 将
a
的相对地址(起点地址+12字节)翻译成它的绝对位置,放在pa
的位置。 - 获取位置
a
的字节和位置b
的字节,将它们相加,然后获取位置pa
的字节。使用位于pa
位置的字节作为地址,并将计算出的总和放在那里。 - 打印位置
a
的字节,首先将它们转换为十进制数。 - 释放内存并让操作系统知道程序已完成。
这是一个有效的翻译吗?
编辑:
让我们假设使用了一个 super 简单的编译器(没有优化)。它只关心 C 代码的有效执行。
最佳答案
这几乎是一种翻译它的方式(a),尽管函数的局部变量通常在堆栈上分配,而不是向操作系统请求一定数量的内存来存储它们。
当然,使用智能编译器,源代码中有足够的信息可以简单地将整个事情优化为:
int main(void) { putchar('3'); }
(a) ISO C 标准不规定如何事情在幕后完成,只是规定它们以特定方式运行。将 C 视为实现标准的虚拟机。 VM 如何执行它并不真正相关,并且除了行为之外当然没有以任何方式强制执行。
关于c - 我将 C 代码翻译成 CPU 指令是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52181952/