具有“静态持续时间”的变量(与static
关键字不同,尽管static
通常声明的变量确实具有静态持续时间)在执行模型中,由main
调用时间“创建”。具有“自动持续时间”的变量(“在堆栈上”,正如许多人所说的那样)是在进入其范围时创建的。malloc
通过last until 显式分配的变量free
d (或通过 减少空间realloc
等)。
上面的关键要点不是“在此时创建”,而是“在此时创建”。如果效率更高,编译器可以更早地自由执行此操作。对于块范围的自动持续时间变量,将它们全部集中到一个大的入口点堆栈分配中通常是最便宜的,编译器可以在最典型的情况下使用单个“减法”指令(“从堆栈指针中减去常量”)来完成现代机器。释放空间要么完全免费(“从函数返回”),要么再次只需要一条指令(“将常量添加到堆栈指针”)。
C99 的可变长度数组(“VLA”)使这有点复杂。一个 VLA 通常必须在每次进入其封闭块时分配,并在每次退出块时释放。同样,这通常相当便宜(从堆栈指针中减去一个以创建 VLA,一个添加以销毁它),但显然每块两条指令比每块零指令更昂贵。这也会稍微干扰一些编译时优化。
如果您曾经使用过非标准alloca
函数,这通常也是通过从堆栈指针中减法来实现的,并且它可能无法与 VLA“很好地配合”,因为这种减法倾向于假定编译器已经完成了自己的“减法”从堆栈指针”恰好一次,就在函数本身开始之前。