在类中声明的变量的内存分配

由于值类型变量在堆栈中分配内存,其中参考类型将其分配到堆中。

那么如何在引用类型(例如,类中)中声明值类型变量(例如int i = 4;)时分配的内存。

整个内存分配如何在.net中用于值类型和引用类型,以及值类型内的值类型。

请解释它或提供有关该链接的任何链接。

谢谢


那么如何在引用类型(例如,类中)中声明值类型变量(例如int i = 4;)时分配的内存。

如果对象位于堆上,则表示它的所有成员变量都位于此处。


值类型变量在堆栈中分配内存,而引用类型在堆中分配内存。

不,这种说法是完全错误的。 正如你所发现的,很多人都相信,但它显然是错误的。

当值类型变量int i = 4;分配的内存如何int i = 4; 被声明为引用类型的字段?

显然你知道为什么你的第一个陈述是完全错误的。 该类的整数字段不能在堆栈上分配,因为该对象可能比堆栈帧寿命更长。

为了理解到底发生了什么,首先你必须认识到有三种东西:

  • 值类型
  • 引用
  • 引用类型的实例
  • 引用类型的 引用实例完全不同,就像一张包含我的地址和我的实际房屋的纸张完全不同。

    接下来你必须了解的是有两种存储方式:长期存储和临时存储。 长期存储通常被称为“堆”,但我更愿意将其视为长期存储。 临时存储通常被称为“堆栈”,但这也会产生误导,因为当然可能存在多个堆栈,临时存储在寄存器中,等等。

    参考类型实例在长期存储中占用内存。 (有时可以确定一个引用类型的实例是短暂的,并将其放入临时存储中,但我们在实践中不会做这种优化。)

    变量是一个存储位置,用于存储值类型的值引用

    在哪里分配变量的存储位置取决于变量的生命周期 。 如果该变量是已知寿命短的局部变量,则从临时存储池中分配该变量。 如果该变量已知具有长生命周期(因为它是闭包的外部变量),那么它将被分配到长期存储池中。

    如果变量是一个类的字段,我们已经知道它的存储来自长期池。 如果变量是一个值类型的字段,则该值类型位于某处的存储区; 该领域居住在相同的存储。

    如果该变量是数组元素,则将其分配到长期存储池中; 数组是引用类型的实例。

    让你的理解正确的关键是简单地停止相信一个变量是否是引用或值类型影响存储分配的神话。 这不是真的,从来没有真实,甚至没有任何意义。

    影响变量存储位置的唯一因素是变量的存活时间 。 短期变量分配到临时池 - 堆栈或寄存器 - 并且长期变量从长期存储池 - 堆中分配。


    这就是为什么Eric Lippert提醒我们,堆栈是一个实现细节。

    当值类型的实例是引用类型yes的成员时,它将与父对象一起存储在托管堆中。 这是一个很好的问题,你应该理解,但不应该在大多数情况下推动你的设计。

    structs应该是小的,简单的数据类型,它们相对便宜地创建和传递。 引用类型是你复杂的类型,只需要引用的副本传递给一个方法,但当然由于被分配在堆上而带有一些行李。 关于堆栈与堆分配的影响,这是一篇很好的后续文章。

    有很多参考文献解释了值类型与参考类型的性能影响。 你应该了解它,并且也应该明白,在大多数情况下,这是一个语义决定,而不是性能决定。

    链接地址: http://www.djcxy.com/p/80217.html

    上一篇: Memory Allocation for Variable Declared in Class

    下一篇: memory allocation of value types and reference types in .net framework