在堆栈上分配大缓冲区
Posted
技术标签:
【中文标题】在堆栈上分配大缓冲区【英文标题】:Allocating large buffers on the stack 【发布时间】:2021-12-29 11:04:49 【问题描述】:在堆栈中分配大缓冲区是否只是一种“不好的方式”(如果堆栈有足够的容量)?我的意思是在 Linux 系统中使用 8 MB 堆栈分配 300-500 KB 的对象。或者它可能会导致任何错误? 另外,有没有关于如何使用堆栈内存的指南?
【问题讨论】:
这取决于您的用例(我们不知道)。经验法则:缓冲区越大,它在堆栈上的分配就越差。 如果不够,您可以更改进程资源限制,因此 8 MB 只是默认限制,而不是硬编码。您可以使用以下命令更改堆栈大小:ulimit -s 8192
.
这很危险。一个函数并不存在于真空中,它被其他函数调用,这些函数可能有自己的堆栈分配变量,反过来又可以被其他一些函数调用。它甚至可以是某些递归算法的一部分。堆栈分配是...堆叠的。
是的,有讨论和指导,有无限的意见。比如这个:when to use stack or heap memory
我个人对堆栈缓冲区的限制为 1 kiB。
【参考方案1】:
是的,这是一种糟糕的方式。该大小的对象将被动态分配(或静态)。没有例外。
如果有一天您的程序要在默认堆栈大小较小的系统上使用怎么办?例如 windows .. 然后你在一次调用中“吃掉”了一半的堆栈。
【讨论】:
【参考方案2】:对于堆栈分配变量的大小没有硬性规定。
作为一般规则,我不希望有任何大于约 10KB 的堆栈分配。这样,堆栈空间不足的问题就不太可能发生了。任何比这更大的东西都应该动态分配,然后在不再需要时释放。
【讨论】:
以上是关于在堆栈上分配大缓冲区的主要内容,如果未能解决你的问题,请参考以下文章