出于好奇,请考虑以下示例:

public class A
{
    public static int Foo;
}

public class Program
{
    static void Main()
    {
        // The following variable will be allocated on the
        // stack and will directly hold 42 because it is a
        // value type.
        int foo = 42;

        // The following field resides on the (high frequency)
        // heap, but is it boxed because of being a value type?
        A.Foo = 42;
    }
}

我的问题如下:框内的Foo字段的值,因为它位于堆上?还是将其封装在一个特殊的容器对象/内存部分中,就像实例值类型字段是堆中对象的一部分一样?

我以为它没有装箱,但我不确定,因此也找不到任何文档。

感谢您的帮助。

最佳答案

CLR没有类的每个字段都必须具有相同存储类型的限制。只有实例成员最终会出现在GC堆上。静态成员在加载程序堆中分配。或当字段具有[ThreadStatic]属性时在线程本地存储中。当然,这强制执行以下约定:该类对象的每个实例都共享一个静态成员。

抖动非常简单地实现,它分配存储并知道字段的地址。因此,任何加载和存储都直接使用变量的地址。没有额外的指针取消引用,非常有效。

因此,不,根本没有必要进行装箱,静态int仅占用4个字节。

如果您想亲自查看,请使用“调试+ Windows +反汇编”窗口。显示机器代码,您将直接使用变量的地址来查看它。每次您运行该程序时,它都是一个不同的地址,这是恶意软件的对策。

10-04 22:39
查看更多