![]() |
1
5
这里有很多混乱。这个 optimizing compiler 可以储存一些 automatic variables 只有在 registers ,而不使用呼叫帧中的任何插槽。C语言规范( n1570 )不需要任何调用堆栈。 并且给定的寄存器或调用帧中的槽可以被重用用于不同的目的(例如函数的不同部分中的不同自动变量)。 Register allocation 是编译器的重要角色。
当然不是。编译器可以证明,在您的代码中,稍后的某个时间点
不 没有。这个 call stack 是一个实现细节,可能不会被编译器和生成的代码使用(或者在您的观点中被“滥用”)。
例如,如果
更严重的是, 一些 案例,GCC能够做到 tail-call 优化。
你应该对
invoking GCC
具有
当然,具体的堆栈使用取决于优化级别。您还可以检查生成的汇编程序代码,例如
例如,以下代码
在Linux/Debian/x86-64上使用GCC8.1编译时,使用
你看到堆栈框架是 不 增加100*4字节。以下情况仍然如此:
它实际上生成与上面相同的机器代码。如果不是
注意
as-if rule
以及
undefined behavior
(如果
|
![]() |
2
4
不,这取决于GCC版本、目标、优化级别和选项。
您的要求非常具体,我想您可能需要用汇编程序编写代码。 |
![]() |
3
1
关于是否使用
|
![]() |
conopizda2 · 为什么我的静态数组没有被memset清除? 2 年前 |
![]() |
jhe4x · C按位OR返回的值不正确 2 年前 |
![]() |
Tim · 如何用c语言打印程序的执行流程# 6 年前 |
![]() |
jatinBatra · 关于嵌入式固件开发[已关闭] 6 年前 |
![]() |
Will · 嵌入链接器脚本-是否正确放置“堆栈”和“堆”区域? 6 年前 |
![]() |
K. Crow · 不等于PIC32上启用中断时操作员不工作[关闭] 6 年前 |
![]() |
spiff42 · 清除位时唯一的最大不同字节值集 7 年前 |