【问题标题】:Why are auto variables allocated in stack memory and not in heap memory in C? [duplicate]为什么自动变量分配在堆栈内存中而不是 C 中的堆内存中? [复制]
【发布时间】:2014-01-19 02:43:49
【问题描述】:

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

【问题讨论】:

  • 堆栈内存更快。在堆栈上分配某些东西的时间开销为零;在堆上分配需要(隐式)调用mallocfree
  • 与范围的亲和度高。
  • 堆分配有失败的可能。使用固定堆栈大小和固定深度堆栈分配和/或使用,保证堆栈分配成功
  • @Brandin 固定甚至有界的堆栈使用很难静态证明(对于一些有用的代码根本不可能)。在大多数系统上,意外溢出堆栈比耗尽地址空间要容易得多。 OOM 几乎总是与逻辑错误或过大的数据集相关联,而堆栈溢出很容易发生在天真地使用递归或在堆栈上创建大型数组“因为它更快”。
  • 还应注意,C 标准并不要求自动变量的堆栈实现。实现可以随心所欲。

标签: c memory memory-management


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-11-21
    • 2010-12-05
    • 2023-03-21
    • 2017-01-04
    • 1970-01-01
    • 2019-12-07
    • 2020-10-02
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多