我试图弄清楚如果从函数中按值返回结构,而不是返回指向该结构的指针,那么在 C++ 中实际会发生什么。如果函数只能返回适合寄存器的值,那么当按值发送结构时,如何进行通信? (我在某处读到过。)
我尝试在 Godbolt 上测试它,看看它在做什么。但我不了解大会,所以这对我来说有点乐观。
在我看来,没有太多汇编知识,该函数只是更改调用该函数之前存在的一些内存?那么这个概念return
从函数中获取某些内容只是一个抽象,该函数只是在已经存在的内存位置中设置一些字节,然后结束跳回到main()
?在这种情况下,根本不会复制任何内容,并且返回的是
“自由的”?
Godbolt:返回整数
Godbolt:返回 struct{int int int}
如果函数只能返回适合寄存器的值,那么当按值发送结构时,如何进行通信?
函数可以返回任何合法返回的内容。然而,只能使用寄存器大小或更小的值来实现return
陈述按照将值留在单个寄存器中的约定,出于显而易见的原因。一些实现允许使用多个寄存器来表示大数据类型;当然,这意味着调用者必须被编写为期望检查多个寄存器以获得完整的返回值。
机器级别的“发生了什么”并不是由语言标准指定的,而是取决于特定的编译器、其优化能力、体系结构的细节等。直截了当实施于ordinary平台的目的是让调用者在堆栈上保留空间(以便它在清理之后持续存在)并让被调用者在那里写入数据。由于分配是静态的,因此在计算调用者的堆栈帧的大小时通常可以简单地考虑所需的空间。该实现可能会默默地生成一个指针并将其传递给寄存器中的被调用者;或者它可能会安排每个调用者将此保留空间放在其堆栈帧中的同一位置,以便被调用者可以向堆栈指针添加偏移量以确定写入位置;或者它可能会做一些我目前没有足够创造力想到的其他事情。
有很多方法可以处理机器级别的函数之间的信息通信,具体取决于机器和语言(尽管我们在进行这些讨论时通常讨论的是 C 或 C++,因为所有其他流行的选择要么在虚拟机上运行,被解释或发生其他一些奇特的事情)。您想要研究的通用术语是应用程序二进制接口,或 ABI。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)