作为函数实参的临时对象与函数栈帧的创建顺序及存储位置问询
临时对象创建时机与存储位置的解答
先修正示例代码的编译问题
原代码中构造函数名称与类名大小写不一致,会导致编译失败,修正后的代码如下:
struct myClass { int x; myClass(int y) { x = y; } }; void function(myClass object) {}; int main() { function( myClass(5) ); // 函数栈帧还是临时对象先创建? }
核心问题解答
1. 临时对象的创建时机
临时对象是在函数栈帧创建之前生成的。
调用function(myClass(5))时,程序会优先执行myClass(5)构造出临时对象,完成初始化后才会为function分配栈帧,再将临时对象作为实参传递给函数(值传递场景下会触发拷贝构造,但从语义逻辑上,临时对象的创建必然早于函数栈帧)。
2. 临时对象的存储位置
- 未优化场景:临时对象最初会创建在**调用者的栈帧(即main函数的栈帧)**中,之后再拷贝到被调用函数
function的栈帧作为形参。 - 优化场景:现代编译器会通过RVO(返回值优化)、NRVO(具名返回值优化)或C++17强制复制消除,直接将临时对象构造在被调用函数的栈帧形参位置,此时临时对象就属于函数栈帧的一部分,避免了额外拷贝。
- 补充:标准规定临时对象属于自动存储期,通常存储在栈上;除非是特别大的对象,部分编译器可能会将其放到堆上,但这是非标准的实现行为。
内容的提问来源于stack exchange,提问作者Rango
相关产品推荐
相关产品推荐

