当前位置: 首页 > 编程语言 > C#

MemoryAllocationofVariablesDeclaredinaClass分享MemoryAllocationofVariablesDeclaredinaClass

时间:2023-04-11 02:10:57 C#

因为Value类型变量是在Stack中分配内存,因为ReferenceType是在Heap中分配。那么在引用类型(例如,在类中)中声明值类型变量(例如inti=4;)时分配的内存又如何呢?.net中的整个内存分配如何针对值类型和引用类型以及引用类型范围内的值类型进行工作。请解释或提供有关它的任何链接。谢谢那么在引用类型(例如在类中)中声明值类型变量(例如inti=4;)时分配的内存又如何呢?如果一个对象在堆上,这意味着它的所有成员变量都在那里。值类型变量在栈上分配内存,而引用类型在堆上分配内存。不,这种说法是完全错误的。很多人相信它,但你发现它显然是假的。值类型变量inti=4时如何分配内存;被声明为引用类型的字段?显然你知道为什么你的第一个陈述是完全错误的。不能在堆栈上分配类的整数字段,因为该对象可能比堆栈帧还长。要了解实际发生了什么,首先要明白有三种情况:引用类型和引用类型的实例完全不同,就像一张写着我地址的纸和我实际住的房子完全不同。接下来要了解的是存储有两种类型:长期存储和临时存储。长期存储通常被称为“堆”,但我更愿意将其视为长期存储。临时存储通常被称为“堆栈”,但这也是一种误导,因为当然可以有多个堆栈,寄存器中可能有临时存储等。引用类型的实例占用长期存储中的内存。(有时可以判断一个引用类型的实例是短暂存在的,将其放在临时存储中,但我们在实践中不做这种优化。)变量是一种存储值或存储位置的类型供参考。分配变量的存储位置取决于变量的生命周期。如果该变量是一个已知的短期局部变量,则从临时存储池中分配。如果已知变量的生命周期很长(因为,例如,它是闭包外部的变量),那么它将从长期存储池中分配。如果变量是一个类的字段,我们已经知道它的存储来自长期池。如果变量是值类型的字段,则该值类型驻留在某处的存储中;该字段位于同一个存储库中。如果变量是数组元素,则从长期存储池中分配;数组是引用类型的实例。让你正确的关键是简单地停止相信变量是引用变量还是值类型会影响存储分配位置的神话。这不是真的,从来都不是真的,甚至没有意义。影响变量存储位置的唯一因素是变量的寿命。短期变量从临时池(堆栈或寄存器)分配,长期变量在长期存储池(堆)之外分配。这就是EricLippert提醒我们堆栈是实现细节的原因。当值类型的实例是引用类型的成员时,它与父对象一起存储在托管堆上。这是一个很好的问题,也是您应该理解的问题,但在大多数情况下不应驱动您的设计。结构应该是小而简单的数据类型,创建和传递起来相对便宜。引用类型是您的复杂类型,它只需要传递给方法的引用的副本,但由于在堆上分配,当然会带来一些负担。这是一篇很好的后续文章,介绍了堆栈与堆分配的含义。有很多参考资料解释了值类型与引用类型的性能影响。您应该对此了如指掌,并且了解在大多数情况下,这是一个语义决定,而不是性能决定。这是一篇好文章。顺便说一句:并不总是成为堆栈上的值——它可能最终会出现在堆上。以上就是C#学习教程的全部内容:类中声明的变量的内存分配。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: