2016-04-23 48 views
0

我了解到an object reference of .NET (C#) is just a pointer.NET(C#)对象引用的标记指针

我的问题是:

  • 是根据CPU架构和/或对象的大小,对象aligned的地址?
  • 如果以上是肯定的,我可以有效地使用对象引用的一些最低有效位作为tagged pointer
+4

这与C#(一种语言)无关。它只是*一个指向实现的指针,如果它选择使用这个。 – user2864740

+0

编译根据像CPU和X86这样的设置来优化代码的速度和内存。通过插入编译指令可以强制对齐,但添加这些可能会使优化器效率降低。 – jdweng

回答

4

不,.NET引用不是指针。当然,在现代硬件上运行的大多数实现中,它可能会使用指针作为实现的一部分。这只是与现代硬件的限制有关 - 目前没有CPU支持引用,据我所知。 x86绝对不是:)

你不应该在.NET中考虑这样的事情 - 你没有得到任何与.NET有关的契约的一部分。在处理本地互操作时,或者当你真的需要优化一些小东西时,你只关心这些事情。无论如何,这个问题毫无意义,因为你不能以你想要的方式来操作引用,而不管它们是否作为指针在内部实现。即使可以,底层指针(如果有的话)随时可能会随着内存管理器的判断而改变 - 它可以随时在堆之间或堆内移动。

.NET也有实际的指针。如果你真的觉得有必要处理这样的结构,你可以。当然,在这种情况下,无论您使用完全本机,C++/CLI还是混合模块,您都很可能希望使用C++而不是C#。

0

为了回答您的其他问题:

是依赖于CPU体系结构 和/或对象的大小,对齐对象的地址?

对象的内存引用大小取决于CPU体系结构。所以说,如果它是32位系统,这意味着它可以覆盖2^32位(或者在64位架构的情况下2^64位)的虚拟存储空间,并且因此存储器参考/地址大小将占用32位/ 4字节(或)64位/ 8字节相应地。