即使是局部变量,C#decimal的值是否也存储在堆上?

当C#decimal是局部变量时,它是否存储在堆上?

我(相信)知道的

> decimal结构有16 bytes.
> ValueType类型的局部变量的值存储在堆栈中,decimal从ValueType继承.
>在32位系统上,参考存储空间只有4个字节;参考存储空间我的意思是下面标有例如baz或bar的方框

Image source.
>对于ValueTypes,这是存储值的位置;对于引用类型,这是存储null或对堆内存位置的引用的位置.

如果在32位系统上只有4个字节可用,那么16位字节大小的十进制值如何存储在堆栈中?

我的想法出了什么问题?

我读过的

> Memory in .NET – what goes where – Jon Skeet
> Arrays,heap and stack and value types – Stackoverflow
> Do value types (Integer,Decimal,Boolean,etc…) inherit from Object? – Stackoverflow
>和互联网上的其他文章……

解决方法

How can the value of a decimal,which is 16 bytes big,be stored on the stack at all where there are only 4 bytes available on a 32bit system? Where did my thinking go wrong?

您的想法在“32位引用适合4个字节”的某处出现了错误,并从“堆栈长度为4个字节”得出结论.认情况下,堆栈长度为百万字节;如果运行时决定在堆栈上放置一个十进制变量(或值),那么它将保留这些百万字节中的16个.

你正在思考计算机是如何工作的,这当然很好,但当然不要忘记C#团队已经努力创建一种语言,你不必关心变量是在堆栈还是堆栈上.你必须写一些非常先进的程序才能解决问题;我从来没有写过一个业务线C#程序,我需要担心堆栈和堆栈,我已经编写了10年的C#程序.

更新:

I’ve updated the image to illustrate that I don’t think the entire stack was 4 bytes long but only the one reference “memory Box”.

太好了.再说一次,让我们假设一个引用是四个字节,在某些机器上它是.如果运行时需要在堆栈上放置引用,它会在堆栈上保留四个字节.不要求堆栈以四字节块的形式保留.它可以保留为任何大小的块.

所以我会更新我的解释.当您假设“引用是四个字节,因此堆栈只能以四字节块保留”时,您出错了.可以在堆栈上保留任意数量的字节,从零到一百万.

(请不要试图保留一百万;不好的事情会发生.有一个原因,为什么.NET指南要求制作16字节或更少的结构!)

现在,出于某些体系结构的性能原因,运行时可能会尝试保留堆栈内存,以便每个块都与四字节边界对齐.如果数据未对齐,某些硬件确实很慢.但这是一个你在C#中几乎不需要担心的细节.

再次更新:

这是考虑它的另一种方式.假设我们有两个普通的局部变量,它们是4字节的整数:

int x;
int y;

这将获得两个内存块,每个内存为四个字节.现在假设我们有一个结构:

struct S 
{ 
    public int x; 
    public int y; 
}

我们创建一个局部变量:

S s;

这和以前完全一样.我们在堆栈上有两个变量,这些变量名为s.x和s.y.将结构放在堆栈上既不比将结构中的所有字段变量放在堆栈上也要多.

再来一次更新:

另一件可能令你感到困惑的事情是,还有另一种称为“寄存器”的临时存储器,它们也用于存储局部变量,寄存器确实只有四个字节长. (除了那些是8,但让我们不去那里.)16字节结构如何存储在寄存器中?事实并非如此.运行时根本不会将大结构放入寄存器中.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...