如果一个结构体是示例/静态字段,或者是另一个对象的一部分,或者是装箱的,或者是在数组中,那么它将只在托管堆中(即可以进行垃圾收集的地方)1。它在托管堆中从来不是“裸露的”a-你可以得到的最接近的是装箱的值。 如果你有一个很大的结构体,这是你的第一个问题。你为什么要创建这样的东西呢?结构体应该总是很小的(经验法则通常是32字节),否则每次你把它用作方法参数或把它赋给另一个变量时,你最终都会复制它。 你考虑过用类来代替吗? [1]正如Eric Lippert喜欢指出的,the stack is an implementation detail。此外,在某些情况下,局部变量最终会成为自动生成类中的字段......但我认为这与这个问题有点无关。
2条答案
按热度按时间ruyhziif1#
如果一个结构体是示例/静态字段,或者是另一个对象的一部分,或者是装箱的,或者是在数组中,那么它将只在托管堆中(即可以进行垃圾收集的地方)1。它在托管堆中从来不是“裸露的”a-你可以得到的最接近的是装箱的值。
如果你有一个很大的结构体,这是你的第一个问题。你为什么要创建这样的东西呢?结构体应该总是很小的(经验法则通常是32字节),否则每次你把它用作方法参数或把它赋给另一个变量时,你最终都会复制它。
你考虑过用类来代替吗?
[1]正如Eric Lippert喜欢指出的,the stack is an implementation detail。此外,在某些情况下,局部变量最终会成为自动生成类中的字段......但我认为这与这个问题有点无关。
vm0i2vca2#
结构类型是值类型,继承自System. ValueType。值类型变量在当前线程的堆栈上分配(不在堆上)。内存不在托管堆上分配。内存在堆栈上分配,并在值类型变量超出范围时自动释放。但是,如果要对值类型变量进行装箱,则会在堆上为变量的 Package 和变量'的字段被复制到 Package 器。如果你的值类型变量大于85 KB,它的 Package 器将被放置在大对象堆(洛)中。LOH对象是长期存在的-它们属于Gen 2。