我读过有关栈,堆以及它们是如何在执行程序中使用的几篇文章。 这里是其中的一个。 它总是说,调用函数时,它的参数都放在堆栈,以及本地变量(严格说是不正确的,因为埃里克利珀中描述了他的岗位 ,但现在这不是我的问题)。
我的问题是存储从函数的返回值,其中,它是如何传递给调用者? 没有人说,它放在堆栈,但仍然没有人说,这是不是。 任何人都可以澄清?
例如,请考虑以下功能:
public DateTime GetTomorrowDate()
{
return DateTime.Now.AddDays(1).Date;
}
我的理解是,这将声明一个局部变量的返回值是否正确? 如果是这样,为什么它没有被破坏,当函数返回它的堆栈帧破坏? 难道是在调用者的堆栈帧声明(即使它没有被呼叫方)? 或者,也许这是什么地方存储在寄存器(我不相信,因为有可能是不适合一些自定义结构的大小合适的寄存器)。
有几种策略(我已经使用)。
- 返回值是足够小,适合到寄存器中,并从该函数返回的用于这个用途预留的寄存器中的值。 这可以根据需要被扩展到2级或更多的寄存器。
- 返回值是作为呼叫方的堆栈帧上的临时变量创建的。 然后参考(指针)到临时在堆栈上,使得所述返回值作为一个额外的,输出参数推动。 在某些语言变量出现的所谓功能命名变量(“结果”)内,在其他国家,编译器生成一个移动到该参数。
- 两个局部变量的创建,一个在函数内部,一个在外部。 该值是从一个拷贝到其他功能上退出。
- 返回值是仅仅作为一个额外的参数创建。 在争论中发现的价值是被调用者就展开栈前拉出。
- 值返回在“特殊”寄存器,诸如浮点累加器。
- 该值被放置在已知位置(诸如任务帧),从它可以在以后检索。
有可能是别人的,但这些都是一个良好的开端。
我的回答是基于阅读的问题是希望的普通技术总结。 在C#的背景下,将适用于JIT生成的代码,而不是CIL本身。
典型的面向堆栈-VM语言(包括CIL)的返回值,从函数主要通过使他们堆栈当函数返回上。 这些参数在下面坐的是,这样一些堆清理之后函数返回所需。
作为@eric说,这是很难看到这个信息可能是有用的。 显然,从函数返回大值类型可能会影响性能,但是这仅仅是预期。
该CIL是相当有据可查的,但JIT编译和其他可能的机制都没有,这将进一步降低此类见解的实用性。