Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 求值堆栈和线程堆栈之间的区别_.net_Clr_Cil - Fatal编程技术网

.net 求值堆栈和线程堆栈之间的区别

.net 求值堆栈和线程堆栈之间的区别,.net,clr,cil,.net,Clr,Cil,我目前正在尝试通过将C#翻译成MSIL命令来自学MSIL 然而,我认为我遇到了一个问题,那就是假设将值推送到“计算堆栈”上,然后弹出并存储在局部变量列表中,这只是引用在运行时分配给线程的堆栈的另一种方式 阅读Eric Lippert关于评估堆栈的文章可以清楚地看出,它们不是同一件事: 我假设您指的是MSIL语言的计算堆栈,而不是运行时的实际每线程堆栈 我的问题是:这两个堆栈之间的确切区别是什么?它们之间有什么关系?不,只有一个堆栈。有一些语言可以区分求值堆栈和返回堆栈。“跳跃”作为主要的例子出现

我目前正在尝试通过将C#翻译成MSIL命令来自学MSIL

然而,我认为我遇到了一个问题,那就是假设将值推送到“计算堆栈”上,然后弹出并存储在局部变量列表中,这只是引用在运行时分配给线程的堆栈的另一种方式

阅读Eric Lippert关于评估堆栈的文章可以清楚地看出,它们不是同一件事:

我假设您指的是MSIL语言的计算堆栈,而不是运行时的实际每线程堆栈


我的问题是:这两个堆栈之间的确切区别是什么?它们之间有什么关系?

不,只有一个堆栈。有一些语言可以区分求值堆栈和返回堆栈。“跳跃”作为主要的例子出现在人们的脑海中,在微处理器的早期相当有影响力。而且非常基于堆栈,一直到语言语法,对程序非常不友好。然而,它很容易实现,只需要2千字节的代码。您对Linq查询的理解大致如下:)

但不,MSIL不是其中之一。VM(虚拟机)只为一个方法定义一个堆栈。它完全是类型无关的,它可以以相同的沉着度存储int、double、对象引用或方法返回地址。向堆栈中推送或弹出一个值只是一个逻辑操作,根本不需要对实际的数据传输进行建模

抖动的任务是将其转换为处理真实数据的机器代码。实际上并不难,处理器也有一个堆栈,就像虚拟机一样。它还可以存储各种不同的数据类型,但当然不能忽略数据大小。最重要的是,消除这种推送和弹出,并充分利用处理器的注册表库,这完全不是MSIL中的模型。这也不是巧合,不同的处理器具有非常不同的注册表库功能。快速编写代码非常重要


是的,每个线程都有自己的堆栈。绝对重要的是,堆栈存储方法返回地址,线程可以执行不同的代码。在MSIL和机器代码中。

基本上,CIL的计算堆栈是使用CIL指令操作的堆栈,实际的每线程运行时堆栈是使用机器代码(汇编)指令操作的堆栈

CIL堆栈在运行时并不真正存在,因为它是CLI规范定义的虚拟机的一部分


CLR JIT编译器所做的是获取使用CIL堆栈的CIL代码,并将其转换为使用实际运行时堆栈的机器代码(特定于您的体系结构,如x86或ARM)。

非常清楚。非常感谢。当你说“向堆栈中推送或弹出一个值只是一个逻辑操作,而不是对实际的数据传输建模”时,你能进一步阐述一下你的意思吗?