我知道用C编码,函数的返回值使用%eax寄存器返回调用者。
使用c ++也可以返回结构而不仅仅是' Primitive'类型,所以当一个函数返回一个struct时,返回的值存储在哪里(堆栈,堆等)?
示例代码:
class Student
{
private:
int m_id;
public:
Student(int id)
{
m_id = id;
};
~Student();
int getId()
{
return m_id;
};
};
Student myFunc()
{
return Student(123);
}
int main()
{
//How does 'student1' get the value from the function?
//Does 'myFunc' write directly to the stack of main?
Student student1 = myFunc();
return 0;
}
答案 0 :(得分:8)
在C中,这取决于平台的ABI。
在x86_64 linux上,有几类数据类型,但简单来说,在寄存器中返回小的简单结构(〜< = 2 longs),在堆栈中返回大的结构。
最新的C ++应该保证RVO(返回值优化)我相信,这意味着结构/类应该在调用者的堆栈上分配,并且被调用者应该通过指针“秘密”写入它们(C ABIs /编译器可以这样做,但在C ++中,RVO还避免了破坏和复制构造。
您可以随时查看程序集或编写基准来验证传递约定。
(在我看来,最好将自己限制在C中的简单返回类型,这样你就不用担心了。(原始C甚至不允许返回结构。)在带有RVO的C ++中没关系。)