引用:
C++的返回值在内存中的传递过程-CSDN博客
智谱清言的回答
------
函数返回值为基本数据类型
int test()
{int a=1;return a;
}int m = test();
返回值存储:函数返回值通常将被存储在 CPU 的通用寄存器中(如 eax
)。
调用者接收:调用该函数的代码可以直接从寄存器中读取返回值。如果返回值太大(如超出寄存器的处理能力),则可能在栈上分配内存。
------
函数返回值为类对象
示例:
A test()
{A a;//进行操作return a;
}A m = test();
它的操作主要在栈上,变量a在函数结束后会被删除。
为了返回a的值,系统会调用 类A
的拷贝构造函数来创建 a
的一个副本,
把副本返回给调用该函数的表达式,函数调用结束后a的副本便不再存在。
这个副本被存储在 test()
函数的栈帧之外的某个位置,通常是调用者 main()
函数的栈帧上,或者是一个临时对象中。
------
如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存。
在处理大型对象或频繁进行拷贝操作的场景下,不合理的拷贝操作会导致严重的性能问题。
------
当然,在现代编译器中,上述过程通常会被优化,以避免不必要的拷贝。
现代编译器会使用RVO或NRVO,如果这些优化不可行或被禁用,编译器会使用移动构造函数和移动赋值运算符来进行优化。
------
函数返回值是右值,不能对它们进行取地址(&)操作,并且它们不能被用作赋值的左侧操作数。
------