gpt4 book ai didi

c++ - 返回值存储在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:17 26 4
gpt4 key购买 nike

我知道用 C 编码,函数的返回值使用 %eax 寄存器返回给调用者。

使用 C++ 还可以返回结构而不仅仅是“原始”类型,因此当函数返回结构时,返回值存储在哪里(堆栈、堆等)?

示例代码:

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;
}

最佳答案

在 C 中,这取决于平台的 ABI。

关于 x86_64 linux ,有几类数据类型,但简单来说,小的简单结构(~ <= 2 长整型)在寄存器中返回,大的通过堆栈返回。

我相信最新的 C++ 应该保证 RVO(返回值优化),这意味着结构/类应该在调用者的堆栈上分配,被调用者应该通过指针“ secret 地”写入它们(C ABI/编译器可以也这样做,但在 C++ 中,RVO 还避免了破坏和复制构造)。

您始终可以查看程序集或编写基准测试来验证传递约定。

(然而,在我看来,最好将自己限制在 C 中的简单返回类型,这样您就不必担心。(原始 C 甚至不允许返回结构。)在带有 RVO 的 C++ 中应该没关系。)

关于c++ - 返回值存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com