gpt4 book ai didi

c - 为什么我们不应该在 C 中的堆栈上动态分配内存?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:28 24 4
gpt4 key购买 nike

我们在 Windows 和 Linux 系统中都有在堆栈上分配内存的函数,但不鼓励使用它们,而且它们不是 C 标准的一部分?这意味着它们提供了一些非标准的行为。由于我经验不足,我无法理解从堆栈分配内存而不是使用堆分配内存时可能出现的问题?

谢谢。

编辑:我的观点:正如 Delan 所解释的,分配给程序的堆栈数量是在编译 期间决定的,因此如果我们用完堆栈,我们不能向操作系统请求更多堆栈。唯一的出路就是崩溃。所以最好让堆栈来存储主要的东西,比如变量、函数、函数调用、数组、结构等,并尽可能多地使用操作系统/机器的容量。

最佳答案

堆栈内存的优点是分配速度通常比堆内存快。

但是,这个问题至少在 alloca(3) 的特定情况下是这样。 ,是在许多实现中,它只是减少堆栈指针,而不考虑或通知实际上是否还有剩余的堆栈空间。

堆栈内存在编译或运行时是固定的,并且在需要更多内存时不会动态扩展。如果堆栈空间用完并调用 alloca,您就有机会获得指向非堆栈内存的指针。您无法知道您是否导致了堆栈溢出。


附录:这并不意味着我们不应该使用动态分配堆栈内存;如果你是

  • 在严格控制和监控的环境中,例如嵌入式应用程序,其中堆栈限制已知或可以设置
  • 仔细跟踪所有内存分配以避免堆栈溢出
  • 确保您的递归次数不足以导致堆栈溢出

然后堆栈分配就可以了,甚至可以节省时间(堆栈指针的运动就是发生的一切)和内存(您使用的是预先分配的堆栈,而不是占用堆)。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com