2010-09-27 2 views
54

Каков размер ссылки на объект в .NET? Это зависит от х86, x64 и/или компиляции AnyCPU?Насколько велика ссылка на объект в .NET?

Если это имеет значение, меня лично интересует C#.

+6

Не дубликат - я говорю о самых ссылках – arootbeer

+0

[см родственного вопроса] [1] [1]: http://stackoverflow.com/questions/26570/sizeof-equivalent- for-reference-types –

+0

Возможный дубликат [C# reference variable mem allocation] (http://stackoverflow.com/questions/489805/c-sharp-reference-variable-mem-allocation) – nawfal

ответ

56

Ссылка сама по себе является указателем. 32 бита на 32-битной ОС, 64 бит на 64-битной ОС.

Размер объекта, на который делается ссылка, является более сложным.

+0

Вот что я понял - я просто хотел чтобы убедиться, что внутри среды не было больше времени. – arootbeer

+0

Интересно, почему 64-разрядный .net использовал бы указатель, а не масштабированное смещение в таблицу «объекты»? 32-битное масштабированное смещение должно было быть достаточным для большинства приложений (приложениям, которым требуется более четырех объектов BILLION, может быть использована специальная модель памяти «superHumungous»), и я думаю, что небольшая дополнительная стоимость использования масштабированной адресации смещения будет больше чем компенсируется улучшенным параллелизмом кэш-памяти, что может быть связано с тем, что ссылки на объекты в два раза больше. – supercat

+2

@supercat, разработчики .NET могут выбрать компиляцию своего приложения в 32-разрядный режим, и все указатели будут 32-битными. Это, вероятно, лучше всего для любого приложения, которому не нужны 64-битные указатели, что является подавляющим большинством приложений. –

14

Ссылка на объект в основном является указателем на память, которая содержит атрибуты объекта. Таким образом, ссылка представляет собой одно процессорное слово длиной - 32 бит на 32-битных платформах и 64 бит на x64.

+0

Есть ли способ измерить, сколько памяти потребляет ** 'объект' **? – Shimmy

17

Для определения размера указателя вы можете использовать System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)), или sizeof(IntPtr) в небезопасном контексте.

Edit:

Или IntPtr.Size.

Смежные вопросы