MATLAB 的堆栈大小是多少?

What is the stack size of MATLAB?

MATLAB R2018a(64 位)的默认堆栈大小是多少?

堆栈大小似乎大于 64 位 C# 程序。

我为什么要问这个

我问这个问题是因为我正在调用英特尔 MKLs LAPACKE_dtrtri,它是高度递归的。

我在 .NET 应用程序中使用该函数,从 C# 调用它时出现堆栈溢出错误,请参阅

另一方面,如果我从 MATLAB 调用我的 .NET 应用程序,我不会收到堆栈溢出错误。这就是我想知道 MATLAB 堆栈大小的原因。

虽然我没有直接回答你的问题,但MATLAB的递归限制可以通过get(0,'RecursionLimit')获得或通过set(0,'RecursionLimit',N)设置。

我相信除此之外,MATLAB 会一直存储变量直到您的 RAM 耗尽,但不是 100% 确定。

使用 kernel32.dll 中的 GetCurrentThreadStackLimits 函数,我可以获得 MATLAB 的堆栈大小。

我在一个名为 IntelMKL.dll 的 .NET 程序集中创建了以下辅助方法:

static class _kernel
{
    [DllImport("kernel32.dll")]
    internal static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
}

public static class MKL
{
    public static uint GetStackSize()
    {
        uint low, high;
        _kernel.GetCurrentThreadStackLimits(out low, out high);
        return high - low;
    }
}

我可以使用以下代码从 MATLAB 调用 GetStackSize

NET.addAssembly('IntelMKL.dll')
IntelMKL.MKL.GetStackSize() % this return 67108864 Bytes which is 64 Mega Bytes

MATLAB 的堆栈大小为 64 MB。

It seems that the stack-size is larger than an 64-bit C# program.

默认的 C# 堆栈大小为 1 MB(32 位)和 4 MB(64 位),请参阅

使用 dumpbin 命令我可以查看 MATLAB.exe 的 header。

dumpbin /headers "C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe"

这个returns

Dump of file C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            8664 machine (x64)
...

OPTIONAL HEADER VALUES
...
         4000000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit

size of stack reserve 是以十六进制表示的堆栈大小。

因此 MATLAB 的堆栈大小为 67108864 字节,即 64 兆字节。