假设我在这里有一段 C 代码:
int main() {
int a = 10;
printf("test1");
printf("test2");
someFunc();
a = 20;
printf("%d",a);
}
我认为所有这些语句一次存储在堆栈中,然后一个接一个地弹出来执行。我对么?如果没有,请纠正我。
答案 0 :(得分:6)
不是真的没有。 C标准没有提到堆栈,所以你的想法是错误的。
只要符合C标准,C编译器(或解释器)可以做任何喜欢的事情。
在你的情况下,除其他外,这可能意味着(i)完全删除a
,因为它仅用于在功能结束时输出20,以及(ii)如果这样做没有副作用,可以删除someFunc()
。
正常发生的是您的代码转换为适合目标架构的机器代码。这些机器代码指令确实倾向于非常忠实地遵循代码(C在这个意义上是相当低的#34;低级别")尽管现代编译器会积极地进行优化。
答案 1 :(得分:2)
C标准没有规定记忆中的内容。
但是,计算机的工作原理如下:
.data
,.bss
,.rodata
,.stack
,.text
,并且可能也是.heap
。 .text
部分用于存储实际的程序代码,其余部分用于存储变量。 More info on Wikipedia。.text
部分内,该部分是只读内存。 因此,对于特定的代码段,存储在堆栈中的唯一内容是变量a
。或者更可能的是,出于性能原因,它存储在CPU寄存器中。
字符串文字"test1"
,"test2"
和"%d"
将存储在.rodata
部分。
文字20
可以存储在.rodata
部分中,或者更有可能合并到代码中,因此与其余代码一起存储在.text
中。
程序计数器确定当前执行的代码部分。堆栈不涉及那么多,它只用于存储数据。
答案 2 :(得分:1)
值得注意的是,C标准没有强制要求实施。因此,只要输出根据标准是正确的,编译器就可以自由选择实现它。
最有可能发生的事情是编译器将此C位转换为汇编代码,然后从上到下执行。
a = 20;
除非您在其他地方使用它,否则最有可能进行优化。好的编译器也会给你一个警告:
警告:未使用的变量a