我在计算机系统中读到程序员的观点,当用汇编代码编程时,关于调用者 - 被调用者协议的约定规定函数的返回值应该存储在eax(或模拟rax,在64位计算机中)寄存器.
我猜这是在C语言编程时"幕后"自动发生的事情,这意味着C编译器"知道"使用eax寄存器来返回函数返回值.
但是当返回的值是一个不适合32位eax或64位rax寄存器的大对象时,C++会发生什么?显然你不能使用堆栈传递它,那么编译器如何处理大对象的按值返回操作?
没关系一个大对象,C编译器如何处理大结构的返回值?
它是将它保存在临时内存空间中并将其地址作为返回值返回吗?如果是这样,它必须预测在运行期间要对函数执行多少次调用,有时这是不可能的,不是吗?
Jos*_*eld 22
显然你不能使用堆栈传递这个...
实际上,理论是每当调用一个函数并且它的堆栈框架被容纳时,它也为返回对象腾出空间.然后由调用函数确保将返回值复制到其自己的堆栈帧中的某个位置,以便它可以保留它.
这直接对应于它在C和C++中的工作方式.您有一个return ...;语句,它将一些值复制到返回对象中.返回对象是一个临时对象,因此调用代码必须将其存储在某处,例如int value = foo();.
但是,几乎没有必要为保留返回值的空间而烦恼.相反,调用函数为它腾出空间,被调用函数将返回值直接放在那里.这正是返回值优化的原因以及复制省略代表的内容.