Для некерованих типів, відомих як типи значень, structs:
Marshal.SizeOf(object);
Для керованих об'єктів ближче, що я отримав - це наближення.
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;
Не використовуйте серіалізацію. Бінарний форматер додає заголовки, тому ви можете змінити свій клас та завантажити старий серіалізований файл у модифікований клас.
Крім того, він не скаже вам реальний розмір пам'яті, а також не врахує вирівнювання пам'яті.
[Редагувати] Використовуючи BiteConverter.GetBytes (prop-value) рекурсивно на кожному властивості вашого класу, ви отримаєте вміст у байтах, який не враховує вагу класу чи посилань, але набагато ближче до реальності. Я рекомендую використовувати байтовий масив для даних та некерований проксі-клас для доступу до значень за допомогою кастингу покажчиків, якщо розмір має значення, зауважте, що ця пам'ять буде вирівняною, тому на старих комп'ютерах буде повільно, але ВЕЛИЧНІ набори даних у СУЧАСНІЙ ОЗУ будуть значно швидше, оскільки мінімізація розміру для читання з оперативної пам’яті матиме більший вплив, ніж нестандартне.