【发布时间】:2021-08-19 11:57:58
【问题描述】:
uint32_t sum_a_b(uint32_t a, uint32_t b) {
return a + b;
}
uint32_t mul_c_d(uint32_t c, uint32_t d) {
return c * d;
}
int main(uint16_t argc, char **argv) {
uint32_t e;
e = mul_c_d(116, sum_a_b(17, 992));
return 0;
}
问题是正在运行的机器在将调用sum_a_b(17, 992) 的结果作为第二个参数传递给mul_c_d 之前将其存储在哪里?
堆栈中有一些“临时变量”?
处理器寄存器?堆?
我在哪里可以阅读到这方面的信息?
与显式使用变量的任何区别,
int main(uint16_t argc, char **argv) {
uint32_t e, t;
t = sum_a_b(17, 992);
e = mul_c_d(116, t);
return 0;
}
??
不幸的是我没有足够的asm/disasm技能来直接检查它....
谢谢!!
【问题讨论】:
-
我猜,因为它是一个
uint32返回类型,在大多数架构和编译器上,它将纯粹保存在累加器寄存器中。并且通常为mul_c_d调用压入堆栈,具体取决于编译器优化。 -
这取决于编译器和“应用程序二进制接口”(ABI)。但是考虑到
mul_c_d调用的结果在分配给e之前存储在某处,就像任何子表达式在用于外部表达式之前的结果一样(至少在抽象意义上)。此类存储位置是匿名的,可以是寄存器或内存。 -
至于使用变量存储中间值。它可能会或可能不会被编译器优化,这可能取决于为编译器选择的优化级别。
标签: c stack heap-memory c99 cpu-registers