返回值传递给调用者的方式也是函数调用约定的一部分。见这里。
例如,关于cdecl
:
许多 C 系统将cdecl
调用约定用于 x86 架构。在cdecl
中,函数参数按从右到左的顺序压入堆栈。函数返回值在 EAX 寄存器中返回(浮点值除外,它在 x87 寄存器 ST0 中返回)。
[...]
的解释有一些变化cdecl
,特别是在如何返回值方面。因此,为不同操作系统平台和/或由不同编译器编译的 x86 程序可能不兼容,即使它们都使用cdecl
约定,不要调用底层环境。一些编译器在 EAX:EDX 中返回长度不超过 2 个寄存器的简单数据结构,而需要异常处理程序(例如,定义的构造函数、析构函数或赋值)特殊处理的较大结构和类对象在内存中返回。为了传递“在内存中”,调用者分配内存并将指向它的指针作为隐藏的第一个参数传递;被调用者填充内存并返回指针,返回时弹出隐藏指针。
如果您在堆上分配内存,堆栈操作将比所需的堆操作快得多,因此堆栈总是更快。(在 C 中)您可能想要返回指向堆上某物的指针的唯一原因是因为它不适合堆栈。
澄清:
在上面的最后一句中,“你可能想要的唯一原因......”不应解释为“通常没有理由返回指针”。相反,我的意思是“如果你可以在不返回指针的情况下做你需要的事情,那么决定使用指针的唯一原因是......”。
当然,正如 Chris 在他自己的回答中所说,从函数返回指针有很多正当理由,但我只是在谈论不需要这样做的情况。
换句话说,尽可能按值返回;必须时使用指针。