在堆栈上分配大缓冲区

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 的堆栈分配。这样,堆栈空间不足的问题就不太可能发生了。任何比这更大的东西都应该动态分配,然后在不再需要时释放。

【讨论】:

以上是关于在堆栈上分配大缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

缓冲区溢出及堆栈/堆操纵

是应该在堆栈还是堆上分配pthread函数参数?

分段错误:当缓冲区>4M 时,Ubuntu 中 C 程序中的堆栈分配

Buffer lab——20145326蔡馨熠

第十一周作业

堆栈缓冲区溢出(Windows,C++):如何检测罪魁祸首?