me preguntaba cuánta memoria hace un objeto que hereda de "objeto" y no tiene campos/propiedades toman? Y creo que los métodos no. Correcto ? Estoy hablando de objetos .net.memoria tomada de un objeto C#
Respuesta
bien, ya que tanto Andrés y Guffa han dado respuestas que yo creo que está mal ...
Hay una sobrecarga de 8 bytes para todos los objetos (en 86), pero hay también un tamaño mínimo de 12 bytes. No sé por qué ... pero significa que estas dos clases tanto toman 12 bytes por ejemplo:
public class OneField
{
private int field;
}
public class NoFields
{
}
prueba:
using System;
public class OneField
{
private int field;
}
public class NoFields {}
public class Test
{
static void Main(string[] args)
{
int size = int.Parse(args[0]);
switch (args[1])
{
case "NoFields":
TestNoFields(size);
break;
case "OneField":
TestOneField(size);
break;
}
}
static void TestNoFields(int size)
{
NoFields[] array = new NoFields[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new NoFields();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
static void TestOneField(int size)
{
OneField[] array = new OneField[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new OneField();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
}
Esto es feo porque no he deliberadamente ido para cualquier tipo genérico o cualquier otra cosa que pueda causar problemas. Algunas pruebas de funcionamiento:
>test 1000000 NoFields
Size per instance: 12.000024
>test 1000000 OneField
Size per instance: 12.000024
>test 1000 NoFields
Size per instance: 12
>test 1000 OneField
Size per instance: 12
(JITting sobrecarga etc explica por qué el número no es siempre un número entero exacto - por lo tanto, por qué hago la división en coma flotante.)
de pruebas con un int adicional muestra de campo el uso va hasta 16, lo que demuestra que en realidad está haciendo algo sensato :)
Buen punto sobre el mínimo de 12 bytes, pero creo que el espíritu de la pregunta se refería exactamente a qué información es "heredada" de 'System.Object'. Sin embargo, tienes razón de que en x86, el primer campo es "libre", por así decirlo, pero sin la sobrecarga de 'System.Object', los primeros 3 campos podrían haber sido gratis :) Aún así, +1 para esta importante distinción. –
La única cabeza que incurriría con un tipo de referencia sería de 4 bytes para el puntero del tipo de objeto y 4 bytes para el índice de bloques de sincronización.
Así que en total, 8 bytes de sobrecarga.
un objeto tiene dos referencias/punteros adicionales para que sus propios datos.
Así, en un sistema de 32 bits del objeto tomaría 8 bytes, en un sistema de 64 bits que tomaría 16 bytes.
Corrección:
Como dijo Jon, el tamaño mínimo para un objeto es de 12 bytes. La información que encontré hasta ahora dice que el GC requiere esto.
No - hay un tamaño de objeto mínimo de 12 bytes en x86, por alguna razón, pero se obtiene el primer campo "libre" :) –
De acuerdo con esta http://msdn.microsoft.com/en-us/magazine/cc163791 .aspx el GC requiere que el objeto tenga al menos 12 bytes por alguna razón. – Guffa
- 1. C#: uso de la memoria de un objeto
- 2. ¿Podría un objeto desasignar su memoria?
- 3. C# ¿Cómo puedo fijar un objeto en la memoria sin ordenar el objeto?
- 4. Estructura de un objeto de C++ en la memoria Vs un Struct
- 5. gdb interpretar la dirección de memoria como un objeto
- 6. Destruyendo un objeto struct en C#?
- 7. C++ memoria asignada dinámicamente
- 8. Volcado de los contenidos de la memoria de un objeto
- 9. Eliminación de un objeto en C++
- 10. Cómo determinar la memoria de un objeto C++ en tiempo de ejecución
- 11. ¿Está volviendo seguro un objeto C++ std :: string de fugas de memoria?
- 12. C++: sobre gestión de memoria
- 13. Tamaño de memoria de un hash u otro objeto?
- 14. Estructura de la memoria de un objeto que solo funciona?
- 15. Serializar un objeto de flujo de memoria en la cadena
- 16. Registrando el uso de la memoria de un objeto
- 17. ¿Cómo se ve un objeto en la memoria?
- 18. Obteniendo el tamaño en memoria de un objeto en PHP?
- 19. Detectar un objeto en una imagen de cámara en C#
- 20. Asignación de memoria en C++
- 21. Crear un objeto C++ no administrado en C#
- 22. Asignación de memoria de objeto Delphi
- 23. C++: Asignadores de memoria
- 24. C Administración de memoria
- 25. C# Cómo abatir un objeto
- 26. Eliminar objeto de la memoria en javascript
- 27. ¿Cómo puedo leer los datos EXIF de una imagen tomada con un iPhone de Apple?
- 28. Averiguar cuánta memoria está siendo utilizada por un objeto en C#?
- 29. C# Cómo realizar una transformación xslt en vivo en un objeto en memoria?
- 30. Toma de volcado de memoria usando C#
Buena pregunta. Yo diría crear algunos millones de ellos y ver la diferencia de memoria antes y después. A menos que alguien ya haya hecho esto. –
Es por eso que pregunté. Necesitaba saber el uso de memoria de la aplicación con millones de objetos. Entonces la respuesta para la aplicación de 32 bits es el tamaño de todos los campos +8 bytes. –