我们不能创建一个c#静态类的对象。那么我们如何能够使用静态类的成员呢? 是否有在运行时创建的内存对象?
答案 0 :(得分:2)
我记得读过一本关于这本书的书,这是我从书中记住的。我认为记住这一点已经足够了。如果我需要了解更多,我会再次阅读它。
GC始终保持指向堆中内存位置的指针,以便它知道在哪里分配下一个对象。这称为下一个对象指针或NOP。
假设你有这个课程
public class Employee
{
private int empId
public void Work()
{
// ...
}
}
以下是实例的外观:
-------------------------- -4 bytes
| Object Header Word |
|------------------------| +0 bytes <------Object reference is pointed here as well
| Method Table Pointer |
|------------------------| +4 bytes for method tabel pointer
| Storage for empId |
|------------------------| +8 bytes (4 for empId) (12 in total (from -4 to +8))
对象标题字用于许多目的,例如同步,GC,哈希码和完成。
方法表指针是指向内部CLR数据结构的指针,该数据结构简称为方法表或MT。 MT指向另一个名为EEClass的结构。 MT和EEClass一起调用虚方法,接口方法,确定运行时对象的类型等。
哦,最后一点,在64位系统上,对象标题字是8个字节(不是4个字节)。即使你在上面的类中有一个bool
而不是int
,它仍然会占用12个字节,因为堆中的对象与最接近的4个字节的多个对齐。