Para tipos no administrados, también conocidos como tipos de valor, estructuras:
Marshal.SizeOf(object);
Para los objetos administrados, cuanto más me acerco es una aproximación.
long start_mem = GC.GetTotalMemory(true);
aclass[] array = new aclass[1000000];
for (int n = 0; n < 1000000; n++)
array[n] = new aclass();
double used_mem_median = (GC.GetTotalMemory(false) - start_mem)/1000000D;
No use serialización. Un formateador binario agrega encabezados, por lo que puede cambiar su clase y cargar un archivo serializado antiguo en la clase modificada.
Además, no le dirá el tamaño real en la memoria ni tendrá en cuenta la alineación de la memoria.
[Editar] Al usar BiteConverter.GetBytes (prop-value) de forma recursiva en cada propiedad de su clase, obtendría el contenido en bytes, que no cuenta el peso de la clase o referencias, pero está mucho más cerca de la realidad. Recomendaría usar una matriz de bytes para los datos y una clase de proxy no administrada para acceder a los valores usando la conversión de puntero si el tamaño importa, tenga en cuenta que sería memoria no alineada, por lo que en las computadoras antiguas será lenta, pero los conjuntos de datos ENORMES en la RAM MODERNA lo serán considerablemente más rápido, ya que minimizar el tamaño para leer desde la RAM tendrá un impacto mayor que no alineado.