当DLL需要比主exe应用程序更大的堆栈大小时该怎么做

What to do when a DLL needs a bigger stack size than the main exe application?

本文关键字:堆栈 小时 DLL 应用程序 exe      更新时间:2023-10-16

我有一个用Visual c++ 2010编写的仿真引擎,我正在为另一个第三方应用程序实现基于它的DLL插件。

然而,当我的库被第三方应用程序的线程调用时,我得到一个堆栈溢出错误。经过调试,发现DLL需要比线程更大的堆栈大小。是否有可能以某种方式扩展当前线程的堆栈大小?

我知道我可能应该检查模拟引擎的代码并将大对象移动到堆中。问题是引擎是由另一个供应商维护的,如果可能的话,我希望避免修改他们的代码。

我正在考虑在DLL中创建自己的线程,具有更大的堆栈大小,并在计算完成时将结果返回给调用线程。这是正确的方法吗?

谢谢,米甲

我建议您检查的第一件事情是实际使用了多少堆栈空间。您是否在堆栈上分配大型对象?你的程序是否利用了显著的递归深度?编写一个测试钩子应用程序,你可以链接到你的DLL并检查你使用了多少堆栈空间。

如果你在堆栈上分配大型对象,我强烈建议将它们移到堆中。

如果你正在做重要的递归,你可能希望研究使用一个循环与基于堆的堆栈由你的DLL维护,而不是依赖于应用程序的堆栈。

我提出这些建议的原因很简单,因为对于一个自包含的插件来说,它的侵入性要小得多,而且不需要特殊的堆栈配置(甚至不需要一个完全独立的线程来拥有更大的堆栈)。

Visual Studio为您提供了两个选项来更改默认堆栈大小(1MB):

/F for编译器https://learn.microsoft.com/cpp/build/reference/f-set-stack-size

/STACK for link:https://learn.microsoft.com/cpp/build/reference/stack

我有你完全相同的问题,并通过生成一个更大的堆栈大小的线程来解决它。我需要大堆栈的代码是隔离良好的设置代码,所以这对我来说是一个相当简单的解决方案。