【问题标题】:Is there a way to increase the default stack size beyond 16777216 bytes?有没有办法将默认堆栈大小增加到 16777216 字节以上?
【发布时间】:2014-09-11 23:08:02
【问题描述】:

问题说明了一切。尝试在链接器选项中增加堆栈大小会产生错误:

最大堆栈大小必须是介于 65536 和 16777216 之间的整数。

这个 16MB 的限制是 Delphi 编译器的基本限制,还是 IDE 强加的任意限制?有没有其他方法可以增加这个值?

注意(期待cmets...):

  • 需要更大的堆栈是由于用作局部变量的大量静态数组类型
  • 我知道这样做是糟糕设计的表现
  • 这是一个大型遗留应用程序,我不负责其设计和维护。
  • 重构为动态数组有效,但会导致 50% 的性能损失。
  • 其他重构是可能的 - 可能需要数周的工作。这很可能最终成为一个副项目。
  • 与此同时,现在需要功能,并且可以轻松解决更大的堆栈问题。
  • 是的,我真的,真的知道这是一件很糟糕的事情。

【问题讨论】:

  • 您尝试过 PXXXArray/GetMem 方法吗?是否可以将最大的局部数组(从非递归过程)移动到全局变量(堆)作为临时解决方案?
  • @MBo 可能,但涉及数百个函数。需要明确的是,我很确定我对如何将其重构为更明智的设计有(几个)好主意。这只是时间和精力的问题。

标签: delphi delphi-xe2 stack-size


【解决方案1】:

这是 Delphi IDE 的限制。您可以使用$MINSTACKSIZE and $MAXSTACKSIZE 指令指定更大的限制。 IDE 设计者决定阻止您在 IDE 中执行您可以通过编译器执行的操作,这似乎很奇怪。

请注意,更改默认堆栈大小是有风险的。这将影响您进程中的所有堆栈,即使对于不是由您的代码创建的线程也是如此。因此,您可能会发现将更改限制在特定线程更有效。这可以通过将堆栈大小作为参数传递给CreateThread 来实现。

最后,我确信会有一个不涉及增加堆栈大小的高性能解决方案。

【讨论】:

  • 要编辑链接后的PE文件,可以使用EDITBIN,在这里找到一篇关于这个的文章:joeduffyblog.com/2006/07/03/…
  • 不幸的是,由于遗留原因,主线程通常在此应用程序中大量参与计算,因此它与工作线程一样受到影响。我也确信有一个高性能的解决方案。然而,上一次我对这个应用程序进行这样的重构时,它花费了三个月的开发时间和另外三个月的调试时间。十七年缺乏经验的开发可能会造成非常非常大的混乱。
【解决方案2】:

您可以使用 {$MAXSTACKSIZE}(或 {$M minstacksize maxstacksize} 编译器指令将其增加到 2147483647。请注意,{$M} 与用于指示为类生成 RTTI 的 {$M+/-} 的用途不同。

来自XE6 docwiki(它也适用于以前的版本):

$M 指令指定应用程序的堆栈分配参数。 minstacksize 必须是介于 1024 和 2147483647 之间的整数,用于指定应用程序堆栈的最小大小,而 maxstacksize 必须是介于 minstacksize 和 2147483647 之间的整数,以指定应用程序堆栈的最大大小。

如果没有足够的可用内存来满足应用程序的最低堆栈要求,Windows 将在尝试启动应用程序时报告错误。

【讨论】:

  • 奇怪 - 项目链接器设置实际上设置为 1MB 默认值,我在 .cfg 文件中有这个编译器指令,将其设置为 16777216。增加它似乎没有效果,这就是为什么我而是转到链接器配置对话框。当我从 .cfg 文件中删除它并将其添加到主 .pas 文件中时,一切都解决了。应该在我的问题中提到它。这似乎奏效了。谢谢!
  • 有没有办法知道这个值使用了多少?
  • @peimanF。请参阅:This answer 以快速轻松地检查提交的堆栈大小。
猜你喜欢
  • 2019-07-02
  • 2015-03-23
  • 1970-01-01
  • 2013-01-04
  • 2017-07-14
  • 2018-02-04
  • 2020-02-02
  • 2015-11-22
  • 2010-11-24
相关资源
最近更新 更多