No meu aplicativo net 8 eu uso Span/stackalloc para alocar rapidamente algumas estruturas de dados. Eu uso o seguinte padrão
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 );
Minhas medições de desempenho mostram um ganho de desempenho muito alto do stackalloc, então eu preferiria usar a alocação de pilha na medida do possível. Portanto, preciso saber o valor máximo seguro para maxStackAllocSize.
Então, qual é o tamanho da pilha padrão para o processo net core de 64 bits? De acordo com o que li deveria ser 4 mb (então considero 2 mb seguro para usar no stackalloc), mas a verificação GetCurrentThreadStackLimits me dá algo próximo de 1,5 mb e não um número muito redondo. Não sei se posso confiar nisso.
O valor é
0x180000
, esse número está configurado neste arquivo: Microsoft.NETCore.Native.Windows.targets . Mas este não é o valor máximo seguro, é óbvio que já existem muitas funções na pilha antes de entrar no método principal. Essa limitação pode ser aumentada modificando oSizeOfStackReserve
campo no cabeçalho PE, mas geralmente não é recomendado alocar mais espaço na pilha do que um tamanho de página do sistema (Environment.SystemPageSize
)