我无法在SO或互联网上找到类似的问题/答案,并且这个问题可能无用,这可能是我在MSIL上阅读时遇到的一个问题.我非常好奇理解IL操作执行在我的场景中是如何工作的,即使这不是一个我没有其他人要问的实际问题.
前提:
请记住,MSIL命令和函数的执行分三步完成:
步骤1和3是可选的.例如,void函数不会将返回值推送到堆栈.
我知道这是一种方法确定需要多少"处理能力"的方法,但为了我的好奇心,我们可以考虑这两个非常基本的方法:
第一种方法:
void Method1()
{
var result = 1+1;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:
int Method2()
{
var result = 1+1;
return result;
}
Run Code Online (Sandbox Code Playgroud)
题:
因为void方法不会推送返回值(或者是否存在隐式返回)这是否意味着在执行时需要较少的开销而不是第二种方法?
但请记住,MSIL不会被执行甚至解释.MSIL是已编译代码的表达式,因为它将在虚拟机上执行.但是JIT编译器将MSIL转换为机器代码(x86等).x86与基于堆栈的虚拟机根本不同.
在最基本的级别,函数返回寄存器中的值.假设寄存器足够大.让我们坚持使用64位值(引用,长整数,双精度和较小值类型).这些可以在RAX寄存器中返回.在您的简单示例中,两个函数的生成机器代码没有区别.那就是Method1:
mov rax, 1
inc rax
ret
Run Code Online (Sandbox Code Playgroud)
(是的,我知道,一个聪明的编译器将崩溃1+1到2.让我们假设有一个内存访问那里,好吗?)
Method2 将是相同的,因为要返回的值已经在RAX寄存器中.
因此,当您使用64位或更小的数量时,返回值的方法与不返回值的方法之间的差异通常会有所不同,如果有的话,只会在加载数据的任何指令中有所不同.将值返回到正确的寄存器中.这通常是单个mov指令.这将取决于事情的完成顺序,以及编译器和JITer如何优化事物.