c - 为什么在 C 中自动变量分配在堆栈内存中而不是堆内存中?

标签 c memory memory-management

我很想知道在 C 语言中在堆栈内存上分配自动变量的必要性。请不要说堆栈内存更快。与堆相比,堆栈内存通常具有较小的大小,并且没有必要为自动变量实现堆栈算法。那为什么auto变量要存放在栈内存中呢?

最佳答案

没有必要。隐式堆分配所有自动变量(并在其生命周期结束时释放它们)是完全正确的,这只是一个相当糟糕的解决方案。堆栈甚至不是最好的选择,寄存器甚至更好。但是,是的,堆栈是寄存器用完时分配自动存储的方式。在堆栈上分配的代码小得多并且速度更快(只需碰撞指针一次)。即使通用堆分配器的快速路径也要昂贵几个数量级。

即使是分段堆栈(保留堆栈模型并仅通过溢出检查和动态增长(以避免溢出)进行增强),也可能使函数调用明显慢于 C。 Rust abandoned segmented stacks因为,除了实现和优化非常棘手之外,它们还是与 C 语言竞争操作系统模块等应用程序的障碍。

请注意,您可以使堆栈任意大。当然,那么它需要更多的地址空间和(如果您实际上使用所有内存)更多的物理内存,但这就是练习的重点,不是吗?

关于c - 为什么在 C 中自动变量分配在堆栈内存中而不是堆内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20869612/

相关文章:

android - 重复的 Activity 初始化和内存使用

javascript - 内存大小: What's Smallest Between String or Array

c - 为什么结构的数据成员内存在堆栈中从低地址到高地址分配从高到低

c - 你应该在 C 程序结束时释放吗

c++ - Valgrind 不适用于 32 位二进制文​​件

在c中创建结构

c - Hooking mmap系统提供实时类型转换?

c++ - 在 main() 之前可能需要做什么样的操作

c++ - Present() 中奇怪的 Direct3D 内存行为

objective-c - 为什么 Objective-C 对象在释放后仍然存在?