así que en C++ es muy fácil. usted quiere que se asigne cualquier clase/estructura en el montón, use nuevo. si lo quieres en la pila, no uses nuevo.C# structs/classes stack/heap control?
en C# siempre usamos la nueva palabra clave, y dependiendo de si se trata de una estructura o una clase, se asigna en la pila o en el montón (las estructuras van a la pila, las clases al montón) y en algunas aplicaciones puede haber una ENORME diferencia de rendimiento cuando se cambia el diseño de modo que solo esos objetos van al montón que realmente pertenecen allí.
Lo que me pregunto es: ¿hay una manera directa de controlar dónde se asigna un objeto independientemente de si se declara como estructura o clase? Sé que los tipos de valores (estructuras) se pueden guardar en cajas para ir al montón (pero el boxeo/unboxing tiene un costo de rendimiento). ¿Hay alguna manera de asignar clases en la pila?
Además, ¿hay algún mecanismo para asignar memoria sin procesar y usar algo así como la ubicación nueva en C++? Sé que esto rompe con la idea de ser administrado, pero puede hacer una gran diferencia en el rendimiento si puede usar su administración de memoria personalizada.
Me encanta C# por su conveniencia, porque es un recolector de basura y otras cosas, pero a veces, al trabajar en el cuello de botella de una aplicación, puede ser conveniente tener más control sobre lo que realmente está sucediendo.
Algún consejo/toques agradables :)
edición: Ejemplo de ejecución:
struct Foo1
{
public int i;
public float f;
public double d;
}
struct Foo2
{
public Foo1[] bar;
public void Init(){
bar = new Foo1[100];
for (int i = 0; i < 100; i++)
bar[i] = new Foo1();
}
}
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
Foo2[] arr = new Foo2[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = new Foo2();
arr[i].Init();
}
Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
}
}
Esto toma 1.8 segundos en mi máquina para ejecutar (tenga en cuenta que en realidad sólo hay asignación pasando - sin paso de parámetros)
si Foo1 se cambia de estructura a clase, la ejecución lleva 8.9 segundos. eso es cinco veces más lento
¿Qué te hace creer que hay una * enorme * diferencia de rendimiento entre la asignación de objetos en la pila y el montón? – LBushkin
Me di cuenta cuando implementé un solucionador de física para un juego 3d: podía optimizar el rendimiento drásticamente cambiando solo las cosas conectadas a donde se asignan los objetos y cómo se pasan los objetos en las funciones – Mat
Usted sabe que la pila y el montón son esencialmente mismo bloque de memoria (almacenamiento en caché a un lado), la asignación es una cuestión de qué puntero se referencia como base. Lo sentimos, para que quede claro que el clásico stack/heap es esencialmente el mismo bloque de memoria – GrayWizardx