.net 8 x64 进程默认堆栈大小是什么(对于 stackalloc)

问题描述 投票:0回答:1

在我的 net 8 应用程序中,我使用 Span/stackalloc 来快速分配一些数据结构。我使用以下模式

float[] myDataRent = null;
Span<float> myData = numberToAllocate <= maxStackAllocSize ? stackalloc float[numberToAllocate] : (myDataRentRent = ArrayPool<float>.Shared.Rent(numberToAllocate));
...
if( myDataRent != null )
    ArrayPool<float>.Shared.Return( myDataRent );

我的性能测量显示 stackalloc 具有非常高的性能增益,因此我更愿意尽可能使用堆栈分配。因此我需要知道 maxStackAllocSize 的最大安全值。

那么 64 位网络核心进程的默认堆栈大小是多少?根据我读到的内容,它应该是 4 mb(然后我认为 2 mb 可以安全地用于 stackalloc),但是 GetCurrentThreadStackLimits 检查给了我接近 1.5 mb 的值,而不是一个非常整数。不知道可不可以相信。

c# memory-management stack-overflow
1个回答
0
投票

但是 GetCurrentThreadStackLimits 检查给了我接近 1.5 mb 的值,而不是一个非常整数

值为

0x180000
,这个数字是在这个文件中配置的:Microsoft.NETCore.Native.Windows.targets。 但这还不是最大安全值,很明显在进入main方法之前栈上已经有很多函数了。可以通过修改 PE 标头中的
SizeOfStackReserve
字段来增加此限制,但通常不建议在堆栈上分配比一个系统页面大小更多的空间 (
Environment.SystemPageSize
)

© www.soinside.com 2019 - 2024. All rights reserved.