混合模式c+中内存使用过多+/CLR应用程序 我有一个本地C++应用程序,我正在调用.NETDLL(外部函数),我看到当我调用托管时,它分配了使用St/StultLink选项指定的线程分配的完整堆栈,但是如果我只做本机函数调用,它分配计算所需的堆栈。

混合模式c+中内存使用过多+/CLR应用程序 我有一个本地C++应用程序,我正在调用.NETDLL(外部函数),我看到当我调用托管时,它分配了使用St/StultLink选项指定的线程分配的完整堆栈,但是如果我只做本机函数调用,它分配计算所需的堆栈。,c++,.net,memory,memory-management,stack-memory,C++,.net,Memory,Memory Management,Stack Memory,以下是我的观察结果 将/stack选项设置为80MB,并调用托管外部函数。 将/stack选项设置为1MB,并调用托管外部函数。 将/stack选项设置为80MB,并调用本机内部函数。 当我们调用.Net外部函数时,还有一些额外的线程与GC相关。此外,与不调用.Net外部函数的情况相比,应用程序中的线程也使用了相当多的堆栈空间。我不确定托管堆栈是否位于本机堆栈的顶部。有人能帮助我理解为什么在调用.Net外部函数和混合模式应用程序中的内存管理时,会分配线程的完整堆栈。好的,我终于找到了答案

以下是我的观察结果

将/stack选项设置为80MB,并调用托管外部函数。

将/stack选项设置为1MB,并调用托管外部函数。

将/stack选项设置为80MB,并调用本机内部函数。


当我们调用.Net外部函数时,还有一些额外的线程与GC相关。此外,与不调用.Net外部函数的情况相比,应用程序中的线程也使用了相当多的堆栈空间。我不确定托管堆栈是否位于本机堆栈的顶部。有人能帮助我理解为什么在调用.Net外部函数和混合模式应用程序中的内存管理时,会分配线程的完整堆栈。

好的,我终于找到了答案

CLR总是在创建托管线程后立即提交托管线程的整个堆栈内存,或者在本机线程变为托管线程时延迟提交。这样做是为了确保执行引擎能够以可预测的方式处理堆栈溢出

在托管代码中,System.Threading.Thread类的构造函数提供了两个接受maxStackSize参数的重载。由于所有托管线程在创建时都会提交完整堆栈,因此maxStackSize参数表示保留大小和提交大小:它们实际上是相同的

仅澄清一下,使用堆栈上的内存有三个步骤:

为进程中的堆栈保留虚拟地址空间 提交页面 使用页面

正常Win32程序的默认行为是在线程启动时只执行1。问题是,动态堆栈增长在高负载下可能会失败—您可能会发现,当您想要添加堆栈帧时,系统没有任何可用的虚拟内存

通过执行步骤2,CLR将确保内存保留为备用,以便步骤3永远不会失败

任何关于这方面的有用信息都将不胜感激。 多谢各位