5

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

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

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

注意(期待评论......):

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

2 回答 2

4

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

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

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

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

于 2014-07-21T13:23:50.800 回答
2

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

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

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

于 2014-07-21T12:48:39.130 回答