MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Сколько памяти занимают объекты?"
Answer 779212
Во первых, в данном коде неправильно измеряется размер для массива ссылочных типов. Код:
var size = GC.GetTotalMemory(true); var arr = new object[count]; for (var i = 0; i < count; ++i) { arr[i] = new object(); } var mem = GC.GetTotalMemory(true) - size;
Измеряет память под массив ссылок + память под объекты. Надо так:
var arr = new object[count]; var size = GC.GetTotalMemory(true); for (var i = 0; i < count; ++i) { arr[i] = new object(); } var mem = GC.GetTotalMemory(true) - size;
Во вторых, арифметика
Размер C = Размер object + 2 * Размер int
не работает: все несколько сложнее.
В CLR существует минимальный размер объекта, см. object.h
// // The generational GC requires that every object be at least 12 bytes // in size. #define MIN_OBJECT_SIZE (2*sizeof(BYTE*) + sizeof(ObjHeader))
Для 64-разрядной версии минимальный размер 2 * 8 + 8 = 24. Размер типа, меньшего 24 байта, дополняется до 24.
(Определение ObjHeader здесь: https://github.com/dotnet/coreclr/blob/master/src/gc/env/gcenv.object.h)
Размер служебного блока, добавляемого к любому ссылочному типу, равен 16 байт (для x86 - 8 байт, см. например здесь, для x64 в два раза больше).
Кроме того, предположительно, работает дополнение размера до числа, кратного 8.
Таким образом:
Размер объекта с 1 int полем = 24 байта
Размер объекта с 2 int полями = 24 байта
Размер объекта с 3 int полями = 32 байта
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.