2009-04-06 22 views
23

¿Qué funcionalidad ofrece la palabra clave stackalloc? ¿Cuándo y por qué querría usarlo?¿Cuándo necesitaría usar la palabra clave stackalloc en C#?

+0

@Paul: Solo revisé la pregunta para agregar un poco más de sustancia. No hubo nada realmente malo con tu fraseo inicial. – TheTXI

+0

Gracias por tomarse el tiempo – PaulB

+0

¿Puede alguien ilustrar cuándo alguien necesita usar una operación insegura en la respuesta también? – Sung

Respuesta

18

De MSDN:

utilizada en un contexto de código no seguro para asignar un bloque de memoria en la pila .

Una de las principales características de C# es que normalmente no necesita acceder a la memoria directamente, como lo haría en C/C++ utilizando malloc o new. Sin embargo, si realmente desea asignar explícitamente algo de memoria, puede hacerlo, pero C# lo considera "inseguro", por lo que solo puede hacerlo si compila con la configuración unsafe. stackalloc le permite asignar dicha memoria.

Es casi seguro que no necesita utilizarlo para escribir código administrado. Es factible que en algunos casos pueda escribir código más rápido si accede directamente a la memoria, básicamente le permite usar la manipulación del puntero que se adapta a algunos problemas. A menos que tenga un problema específico y el código inseguro sea la única solución, entonces probablemente nunca lo necesite.

+2

StackOverflow está diseñado para que las personas que REALIZAN búsquedas en Internet encuentren la respuesta aquí (solo tiene que preguntárselo primero). – TheTXI

+0

Desafortunadamente, sonó grosero :) Quizás esta persona no entienda la diferencia entre asignar memoria en la pila y el montón. Tu respuesta fue obvia e innecesaria. –

+0

Adam, no necesariamente estoy de acuerdo. Él * probablemente * habría formulado su pregunta de manera diferente, por ejemplo algo como '¿Cuándo necesitaría usar la palabra clave stackalloc?'. – Razzie

2

stackalloc dirige el .NET runtime para asignar memoria en la pila.

0

Es como lo señaló Steve, que solo se usa en contextos de códigos inseguros (por ejemplo, cuando desea utilizar punteros).

Si no utiliza un código inseguro en su aplicación C#, entonces nunca lo necesitará.

9

Paul,

Como todo el mundo aquí se ha dicho, esa palabra clave dirige el tiempo de ejecución para asignar en la pila en lugar de la pila. Si está interesado en saber exactamente lo que esto significa, consulte this article.

+2

+1 para la pila y el montón – Sung

15

Stackalloc asignará datos en la pila, que se pueden usar para evitar la basura que se generaría al crear y destruir repetidamente matrices de tipos de valores dentro de un método.

public unsafe void DoSomeStuff() 
{ 
    byte* unmanaged = stackalloc byte[100]; 
    byte[] managed = new byte[100]; 

    //Do stuff with the arrays 

    //When this method exits, the unmanaged array gets immediately destroyed. 
    //The managed array no longer has any handles to it, so it will get 
    //cleaned up the next time the garbage collector runs. 
    //In the mean-time, it is still consuming memory and adding to the list of crap 
    //the garbage collector needs to keep track of. If you're doing XNA dev on the 
    //Xbox 360, this can be especially bad. 
} 
+0

Tenga en cuenta que debido al análisis de escape, 'managed' se puede asignar en la pila independientemente. – rightfold

0

La mayoría de las demás respuestas se centran en la parte de "qué funcionalidad" de la pregunta de OP.
Creo que esto responderá al cuándo y por qué:

¿Cuándo lo necesita?
Para obtener el mejor rendimiento en el peor de los casos con la localidad de caché de varias matrices pequeñas.

Ahora, en una aplicación promedio no necesitará esto, pero para los escenarios sensibles en tiempo real le da un rendimiento más determinista: no hay GC involucrado y está garantizado un golpe de caché.
(Porque el peor de los casos es más importante que el rendimiento promedio.)

¡Sin embargo, tenga en cuenta que el tamaño de pila predeterminado en .net es pequeño!
(creo que es 1MB para aplicaciones normales y 256kb para ASP.net?)

El uso práctico podría incluir, por ejemplo, el procesamiento de sonido en tiempo real.

Cuestiones relacionadas