当DLL需要比主exe应用程序更大的堆栈大小时该怎么做
What to do when a DLL needs a bigger stack size than the main exe application?
我有一个用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
我有你完全相同的问题,并通过生成一个更大的堆栈大小的线程来解决它。我需要大堆栈的代码是隔离良好的设置代码,所以这对我来说是一个相当简单的解决方案。
- 为什么在读取文件大小时文件IO速度会发生变化
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 在容量内调整矢量大小时的性能影响
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 我在 36603 以上输入的任何数组大小时都会返回"堆栈溢出"错误。如何使字符串能够捕获整个.txt文件?
- 当DLL需要比主exe应用程序更大的堆栈大小时该怎么做
- C++ 由于堆栈溢出,迭代合并排序的实现在大输入大小时崩溃