C++函数如何返回大对象或结构?

so.*_*red 18 c c++ assembly

我在计算机系统中读到程序员的观点,当用汇编代码编程时,关于调用者 - 被调用者协议的约定规定函数的返回值应该存储在eax(或模拟rax,在64位计算机中)寄存器.

我猜这是在C语言编程时"幕后"自动发生的事情,这意味着C编译器"知道"使用eax寄存器来返回函数返回值.

但是当返回的值是一个不适合32位eax或64位rax寄存器的大对象时,C++会发生什么?显然你不能使用堆栈传递它,那么编译器如何处理大对象的按值返回操作?

没关系一个大对象,C编译器如何处理大结构的返回值?

它是将它保存在临时内存空间中并将其地址作为返回值返回吗?如果是这样,它必须预测在运行期间要对函数执行多少次调用,有时这是不可能的,不是吗?

Jos*_*eld 22

显然你不能使用堆栈传递这个...

实际上,理论是每当调用一个函数并且它的堆栈框架被容纳时,它也为返回对象腾出空间.然后由调用函数确保将返回值复制到其自己的堆栈帧中的某个位置,以便它可以保留它.

这直接对应于它在C和C++中的工作方式.您有一个return ...;语句,它将一些值复制到返回对象中.返回对象是一个临时对象,因此调用代码必须将其存储在某处,例如int value = foo();.

但是,几乎没有必要为保留返回值的空间而烦恼.相反,调用函数为它腾出空间,被调用函数将返回值直接放在那里.这正是返回值优化的原因以及复制省略代表的内容.

  • @ so.very.tired是的,只要它正在执行RVO(任何编译器在过去多年都会这样做).该对象不是临时的,临时对象被完全删除.它只是将值直接存储在调用函数将存储结果的对象中.因此在`int value = foo();`示例中,`foo`函数将其结果直接存储在`value`中. (3认同)

das*_*ght 15

显然你不能使用堆栈传递它

您可以!诀窍是让调用者在堆栈上分配空间,然后让函数填充它.

本质上,该函数返回堆栈帧的调用者部分中的数据.