¿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#?
Respuesta
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.
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
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. –
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
http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx
esta palabra clave se utiliza para trabajar con la manipulación de la memoria insegura. Al usarlo, tiene la capacidad de usar el puntero (una característica poderosa y dolorosa en C/C++)
stackalloc
dirige el .NET runtime para asignar memoria en la pila.
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á.
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.
+1 para la pila y el montón – Sung
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.
}
Tenga en cuenta que debido al análisis de escape, 'managed' se puede asignar en la pila independientemente. – rightfold
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.
- 1. Uso práctico de la palabra clave `stackalloc`
- 2. ¿Cuándo se debe usar la palabra clave volátil en C#?
- 3. ¿Cuándo debemos usar la palabra clave extern alias en C#?
- 4. ¿Cuándo debería usar la palabra clave "this" en C++?
- 5. ¿Cuándo debería usar la palabra clave "self"?
- 6. ¿Cuándo NO DE USAR esta palabra clave?
- 7. ¿Cuándo debería usar la palabra clave "strictfp" en java?
- 8. C# Cuándo debe usar el palabra "this"
- 9. Cuándo pasar la palabra clave ref en
- 10. ¿Cuándo es necesaria la palabra clave "typename"?
- 11. ¿Cuándo ha utilizado la palabra clave "mutable" de C++?
- 12. Java: cuándo utilizar la palabra clave 'this'
- 13. ¿Cuándo debería usar Apache Commons 'Validate.isTrue, y cuándo debo usar la palabra clave' assert '?
- 14. ¿Puedo usar la palabra clave `abstracta` en la clase C++
- 15. C++ const palabra clave: ¿usar liberalmente?
- 16. ¿Cómo uso programáticamente la palabra clave "usar" en C#?
- 17. C: ¿Vale la pena la palabra clave en línea?
- 18. ¿Cuándo NO utilizar la palabra clave estática en Java?
- 19. C# ref uso de la palabra clave
- 20. ¿Cómo puedo usar correctamente la palabra clave volátil en Java?
- 21. ¿La nueva palabra clave 'dinámica' C# 4.0 desaprueba la palabra clave 'var'?
- 22. ¿Cuándo utiliza exactamente la palabra clave volátil en Java?
- 23. Registro palabra clave en C++
- 24. palabra clave "agradable" en C++?
- 25. Palabra clave protegida C#
- 26. palabra clave 'fuera' en C++
- 27. palabra clave estática en C#
- 28. ¿Cuándo es necesaria nuestra palabra clave?
- 29. C# palabra clave virtual
- 30. ¿Cuándo necesitaría utilizar encuadernación estática tardía?
@Paul: Solo revisé la pregunta para agregar un poco más de sustancia. No hubo nada realmente malo con tu fraseo inicial. – TheTXI
Gracias por tomarse el tiempo – PaulB
¿Puede alguien ilustrar cuándo alguien necesita usar una operación insegura en la respuesta también? – Sung