You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

作为函数实参的临时对象与函数栈帧的创建顺序及存储位置问询

临时对象创建时机与存储位置的解答

先修正示例代码的编译问题

原代码中构造函数名称与类名大小写不一致,会导致编译失败,修正后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:27:34