有没有办法将默认堆栈大小增加到16777216字节以外?

时间:2014-07-21 12:32:17

标签: delphi delphi-xe2 stack-size

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

  

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

此16MB限制是Delphi编译器的基本限制还是IDE强加的任意限制?还有另一种方法来增加这个价值吗?

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

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

2 个答案:

答案 0 :(得分:4)

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

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

  

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

     

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

答案 1 :(得分:2)

这是Delphi IDE的限制。您可以使用$MINSTACKSIZE and $MAXSTACKSIZE指令指定更大的限制。看起来很奇怪IDE设计者决定阻止你从IDE做一些你可以从编译器做的事情。

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

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