我瞭解到an object reference of .NET (C#) is just a pointer。.NET(C#)對象引用的標記指針
我的問題是:
- 是根據CPU架構和/或對象的大小,對象aligned的地址?
- 如果以上是肯定的,我可以有效地使用對象引用的一些最低有效位作爲tagged pointer?
我瞭解到an object reference of .NET (C#) is just a pointer。.NET(C#)對象引用的標記指針
我的問題是:
不,.NET引用不是指針。當然,在現代硬件上運行的大多數實現中,它可能會使用指針作爲實現的一部分。這只是與現代硬件的限制有關 - 目前沒有CPU支持引用,據我所知。 x86絕對不是:)
你不應該在.NET中考慮這樣的事情 - 你沒有得到任何與.NET有關的契約的一部分。在處理本地互操作時,或者當你真的需要優化一些小東西時,你只關心這些事情。無論如何,這個問題毫無意義,因爲你不能以你想要的方式來操作引用,而不管它們是否作爲指針在內部實現。即使可以,底層指針(如果有的話)隨時可能會隨着內存管理器的判斷而改變 - 它可以隨時在堆之間或堆內移動。
.NET也有實際的指針。如果你真的覺得有必要處理這樣的結構,你可以。當然,在這種情況下,無論您使用完全本機,C++/CLI還是混合模塊,您都很可能希望使用C++而不是C#。
爲了回答您的其他問題:
是依賴於CPU體系結構 和/或對象的大小,對齊對象的地址?
對象的內存引用大小取決於CPU體系結構。所以說,如果它是32位系統,這意味着它可以覆蓋2^32位(或者在64位架構的情況下2^64位)的虛擬存儲空間,並且因此存儲器參考/地址大小將佔用32位/ 4字節(或)64位/ 8字節相應地。
這與C#(一種語言)無關。它只是*一個指向實現的指針,如果它選擇使用這個。 – user2864740
編譯根據像CPU和X86這樣的設置來優化代碼的速度和內存。通過插入編譯指令可以強制對齊,但添加這些可能會使優化器效率降低。 – jdweng