我们在Windows和Linux系统中都有在堆栈上分配内存的功能,但是不鼓励它们使用它们也不是C标准的一部分?这意味着它们提供了一些非标准行为。由于我没有经验,我无法理解从堆栈分配内存而不是使用堆时会出现什么问题?
感谢。
编辑:我的观点:由于Delan已经解释过分配给程序的堆栈数量是在编译时间内决定的,所以如果我们用完它就不能从操作系统中请求更多的堆栈。唯一的出路就是崩溃。所以最好离开堆栈来存储诸如变量,函数,函数调用,数组,结构等主要内容,并使用堆与OS /机器的容量一样多。答案 0 :(得分:5)
堆栈内存的优势在于,堆内存的分配速度通常更快。
然而,至少在alloca(3)
的特定情况下,这个问题在于,在许多实现中,它只是减少堆栈指针,而不考虑或通知是否实际存在任何堆栈空间离开。
堆栈内存在编译或运行时是固定的,并且在需要更多内存时不会动态扩展。如果用完堆栈空间并调用alloca
,则有可能获得指向非堆栈内存的指针。您无法知道是否导致堆栈溢出。
附录:这并不意味着我们不应该使用动态分配堆栈内存;如果你是
然后堆栈分配很好,甚至可以节省时间(堆栈指针的运动都发生了)和内存(你正在使用预先分配的堆栈,而不是进入堆中)。
答案 1 :(得分:0)
与堆相比,堆栈内存(广义上是自动的)快速,安全和万无一失。
快速:因为它是在编译时分配的,所以不涉及任何开销
安全:这是异常安全的。当抛出异常时,堆栈会自动清空。
完整的证明:您不必担心virtual
析构函数的情况。析构函数按正确顺序调用。
有时,你必须分配内存运行时,那时你可以先使用标准容器,如vector
,map
,list
等。将内存分配给行指针应该始终是一个明智的决定。