【问题标题】:Is it a good idea to extend the size of the stack for large local data processing?为大型本地数据处理扩展堆栈大小是个好主意吗?
【发布时间】:2012-07-10 17:12:33
【问题描述】:
我的环境是 gcc、C++、Linux。
当我的应用程序进行一些数据计算时,它可能需要一个“大”(可能是几 MB)的内存来存储数据、计算结果和其他东西。我得到了一些使用 new、delete 的代码来完成这个。由于在某些函数范围之外没有所有权,我认为所有这些内存都可以在堆栈中分配。
问题是,默认堆栈大小(在我的系统中为 8192Kb)可能不够。我可能需要更改这些堆栈分配的堆栈大小。而且,如果以后计算需要更多的数据,我可能需要再次扩展堆栈大小。
那么是否可以选择扩展堆栈大小?既然不能分配给具体的功能,对整个应用会有什么影响呢? 真的在堆栈上而不是在堆上分配数据是一种改进吗?
【问题讨论】:
标签:
c++
linux
memory
memory-management
【解决方案1】:
您提出了一个没有直接答案的有争议的问题。两边各有利弊。特别是:
堆上的内存更容易控制:可以检查返回值或允许抛出异常。当堆栈溢出时,您的线程会被简单地卸载,并且调试器不会显示任何有意义的更改。
相反,堆栈分配是自动发生的,您无需执行任何特定操作。我一直喜欢这种简单性。
在堆栈上分配大量数据并没有根本性的错误。归根结底,任何类型的记忆最终都是记忆。这意味着所需的内存总量才是真正重要的。分配此内存的位置不太重要。当有足够的内存供您的应用程序工作时,分配内存的位置没有区别。例如,它可以是静态的。
不同的系统有不同的分配规则。这意味着最终决定可能取决于实际系统。
【解决方案2】:
虽然堆栈分配确实更有效(在多线程程序中更明显),但如果您的使用模式是“分配一大块内存,处理数据,释放它”,那么就赢了改善不大。
改为重写代码以使用 RAII,例如std::vector 或 std::unique_ptr 所以不会有明显的错误deletes。
【解决方案3】:
如果您使用 Linux,您可以使用 ulimit 命令更改堆栈大小。但是,我认为从堆中分配的内存对您也有好处。