c# keyword stackalloc

c# - Uso práctico de la palabra clave `stackalloc`



keyword (3)

He utilizado stackalloc para asignar almacenamientos intermedios para el trabajo de DSP en tiempo [casi] en tiempo real. Fue un caso muy específico en el que el rendimiento debía ser lo más constante posible. Tenga en cuenta que existe una diferencia entre la consistencia y el rendimiento general; en este caso, no me preocupaba que las asignaciones de heap fueran demasiado lentas, solo con el no determinismo de la recolección de basura en ese punto del programa. No lo usaría en el 99% de los casos.

¿Alguien ha usado stackalloc vez stackalloc mientras programaba en C #? Soy consciente de lo que hace, pero la única vez que aparece en mi código es por accidente, porque Intellisense lo sugiere cuando empiezo a escribir static , por ejemplo.

Aunque no está relacionado con los escenarios de uso de stackalloc , en realidad hago una cantidad considerable de interoperabilidad heredada en mis aplicaciones, por lo que de vez en cuando podría recurrir al uso de código unsafe . Pero, sin embargo, suelo encontrar maneras de evitar completamente unsafe .

Y dado que el tamaño de la pila para un solo hilo en .Net es ~ 1Mb (corríjame si estoy equivocado), estoy aún más reservado de usar stackalloc .

¿Hay algunos casos prácticos donde uno podría decir: "esta es exactamente la cantidad correcta de datos y procesamiento para que no sea seguro y use stackalloc "?


La única razón para usar stackalloc es el rendimiento (ya sea para cálculos o interoperabilidad). Mediante el uso de stackalloc lugar de una matriz asignada de montón, se crea menos presión de GC (la GC necesita ejecutarse menos), no es necesario fijar las matrices, es más rápida de asignar que una matriz de montón, y se libera automáticamente en método de salida (las matrices asignadas en el montón solo se desasignan cuando se ejecuta GC). Además, al usar stackalloc lugar de un asignador nativo (como malloc o el equivalente de .Net) también obtienes velocidad y desasignación automática en la salida del alcance.

En cuanto al rendimiento, si usas stackalloc , aumentarás enormemente las posibilidades de visitas a la memoria caché en la CPU debido a la localidad de los datos.


stackalloc solo es relevante para código inseguro. Para el código administrado, no puede decidir dónde asignar los datos. Los tipos de valores se asignan en la pila por defecto (a menos que sean parte de un tipo de referencia, en cuyo caso se asignan en el montón). Los tipos de referencia se asignan en el montón.

El tamaño de pila predeterminado para una aplicación plain plain .NET es de 1 MB, pero puede cambiar esto en el encabezado PE. Si está iniciando subprocesos explícitamente, también puede establecer un tamaño diferente a través de la sobrecarga del constructor. Para las aplicaciones ASP.NET, el tamaño predeterminado de la pila es de solo 256K, que es algo a tener en cuenta si cambia entre los dos entornos.