Наскільки великим є посилання на об’єкт у .NET?


77

Який розмір посилання на об’єкт у .NET? Чи відрізняється воно між x86, x64 та / або компіляцією AnyCPU?

Якщо це має значення, мене особисто цікавить C #.


[См споріднений питання] [1] [1]: stackoverflow.com/questions/26570 / ...
Tim Hoolihan

можливий дублікат виділення посилання змінної посилання c #
nawfal

Відповіді:


86

Посилання в основному є покажчиком. 32 біти в 32 бітовій ОС, 64 біти в 64 бітовій ОС.

Розмір об'єкта, на який посилається, є більш складним.


1
Цікаво, чому 64-розрядний .net використовував би вказівник, а не масштабований зсув у таблиці "об'єкти"? 32-бітового масштабованого зміщення повинно було вистачити для більшості додатків (додатки, які потребують більше чотирьох МІЛЯРД об'єктів, можуть використовувати спеціальну "надгумусну" модель пам'яті), і я вважаю, що невеликі додаткові витрати на використання масштабованої адресації переміщення будуть більшими ніж компенсована вдосконаленою одночасністю кешу, яка виникла б у результаті зменшення посилань на об'єкти вдвічі менше.
supercat

5
@supercat, розробники .NET можуть вибрати компіляцію своєї програми в 32-розрядний режим, і всі вказівники будуть 32-розрядними. Це, мабуть, найкраще для будь-якої програми, яка не потребує 64-розрядних покажчиків, що є переважною більшістю програм.
Самуель Нефф,

1
@SamuelNeff: Згідно з іншими речами, які я вже читав, 64-розрядні програми пропонують кращу продуктивність, оскільки набір інструкцій із 64 розрядами дозволяє використовувати більше регістрів і, як правило, є більш ефективним. Я вважаю, що використання 32-розрядних посилань на об'єкти ще більше покращить продуктивність.
supercat

1
@supercat, є багато суперечливих повідомлень про 32-бітну та 64-бітну продуктивність. Ось такий, який сильно віддає перевагу 32-розрядному. blogs.msdn.com/b/ricom/archive/2009/06/10/…
Семюель Нефф

2
@SamuelNeff: Хоча на вихідне запитання можна було відповісти "4 байти на x86; 8 байтів на x64", це питання саме по собі не було б дуже цікавим чи проникливим. Знання того, що впливає на продуктивність 8-байтових посилань на об’єкти, здається дещо проникливішим.
supercat

21

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

Редагувати:

Або IntPtr.Size.


16

Посилання на об’єкт - це в основному вказівник на пам’ять, що містить атрибути об’єкта. Таким чином, посиланням є одне процесорне слово довжиною - 32 біти на 32-бітних платформах і 64 біти на x64.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.