3

我的环境是 gcc、C++、Linux。当我的应用程序进行一些数据计算时,它可能需要一个“大”(可能是几 MB)的内存来存储数据、计算结果和其他东西。我得到了一些使用new , delete的代码来完成这个。由于在某些函数范围之外没有所有权,我认为所有这些内存都可以在堆栈中分配。

问题是,默认堆栈大小(在我的系统中为 8192Kb)可能不够。我可能需要更改这些堆栈分配的堆栈大小。此外,如果将来计算需要更多数据,我可能需要再次扩展堆栈大小。

那么扩展堆栈大小是一种选择吗?既然不能分配给具体的功能,对整个应用会有什么影响呢?在堆栈上而不是在堆上分配数据真的是一种改进吗?

4

3 回答 3

6

你提出了一个没有直接答案的有争议的问题。两边各有利弊。尤其:

  1. 堆上的内存更容易控制:您可以检查返回值或允许抛出异常。当堆栈溢出时,您的线程会被简单地卸载,并且调试器不会显示任何有意义的更改。

  2. 相反,堆栈分配是自动发生的,您不需要做任何具体的事情。我总是喜欢这种简单。

在堆栈上分配大量数据并没有根本性的错误。归根结底,任何类型的记忆最终都是记忆。这意味着所需的内存总量才是真正重要的。分配此内存的位置不太重要。当有足够的内存供您的应用程序工作时,分配内存的位置没有区别。例如,它可以是静态的。

不同的系统有不同的分配规则。这意味着最终决定可能取决于实际系统。

于 2012-07-11T06:34:23.063 回答
3

虽然堆栈分配确实更有效(在多线程程序中更明显),但如果您的使用模式是“分配一大块内存,处理数据,释放它”,那么就不会有很多改进。

而是重写代码以使用 RAII,例如std::vectorstd::unique_ptr不会有明确delete的 buggy 。

于 2012-07-11T06:30:31.097 回答
0

如果您使用 Linux,则可以使用 ulimit 命令更改堆栈大小。但是,我认为从堆中分配的内存也对你有好处。

于 2012-07-13T09:13:29.273 回答