【问题标题】: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)的内存来存储数据、计算结果和其他东西。我得到了一些使用 newdelete 的代码来完成这个。由于在某些函数范围之外没有所有权,我认为所有这些内存都可以在堆栈中分配。

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

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

【问题讨论】:

    标签: c++ linux memory memory-management


    【解决方案1】:

    您提出了一个没有直接答案的有争议的问题。两边各有利弊。特别是:

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

    2. 相反,堆栈分配是自动发生的,您无需执行任何特定操作。我一直喜欢这种简单性。

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

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

    【讨论】:

      【解决方案2】:

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

      改为重写代码以使用 RAII,例如std::vectorstd::unique_ptr 所以不会有明显的错误deletes。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2023-04-10
          • 1970-01-01
          • 2018-08-10
          • 2023-03-14
          • 2013-04-01
          • 2018-01-29
          • 2016-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多