thi*_*eek 14 c# clr language-design
为什么C#(.Net)更喜欢堆栈来存储值类型?这种设计背后的主要原因是什么?是否因为对堆栈的读/写操作更好地利用了机器处理器?
此外,也许你可以证明为什么不是其他人?
Mar*_*ell 33
Eric Lippert在这里讨论了这个问题 ; 首先,"值类型存储在堆栈中"是不正确的.它们有时是,但不是:
当它们可以存储在堆栈中时,它是一种模拟其生命周期的便捷方式,但不需要将它们存储在堆栈中.你可以写一个编译器+ CLI不具有堆栈,例如.
jas*_*son 14
C#不会在堆栈上存储任何内容.C#是一种编程语言.因此,更正确的问题版本是为什么Microsoft C#编译器发出CIL指令以在堆栈上分配值类型?
嗯,首先,它有时只会.以下内容不会进入堆栈:
其次,当它可能完成时,因为它是有效的.基本上在CLR内存模型中,与堆上的解除分配相比,堆栈上的释放相对非常便宜.对于值类型的本地,您可以确定除了本地之外没有其他人会引用内存,因此您可以使用堆栈而不是堆来逃避.有关详细信息,请参阅Eric Lippert.
最后,使值类型特殊的是它们具有值类型语义(按值复制),而不是它们有时在堆栈上分配.C#规范中没有要求编译器发出指令以在堆栈上分配值类型.C#规范要求的是值类型具有值类型语义.
正如@Akash指出的,它主要与内存有关。在CLR的设计过程中,我们注意到(我的猜测是基于Java的经验),将小的原始类型表示为带有受垃圾收集器处理的对象的对象会导致大量跟踪开销。因此,设计人员想要一个不需要跟踪的“轻量级”对象。
在CLI规范中,对于要堆栈分配的原语没有特别要求;这是在计算机上实施的产物。重要的一点是,运行时知道实例在何处是由于定义良好的内存模式(称为帧)的构造,而不是由于GC的已分配对象索引所致。在x86(和类似的)计算机上,可以使用堆栈有效地完成此操作。
| 归档时间: |
|
| 查看次数: |
8721 次 |
| 最近记录: |