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

基于栈内存视角:C++中指针与引用的差异解析

C++栈内存视角下的指针与引用传参差异

指针传参的栈帧分析(你已理解的情况)

#include <iostream>
using namespace std;

void swap(int *x, int *y){
    int temp;
    temp  = *x;
    *x = *y;
    *y  = temp;    
}

int main(){
    int i1 = 3, i2 = 7;
    swap (&i1,&i2);
    return 0;
}
  • 变量i1、i2在main函数的栈帧中创建。
  • 调用swap函数时,swap的栈帧中会创建指针变量x、y,它们被初始化为i1和i2的内存地址。
  • swap栈帧中还会创建临时变量temp,函数执行完毕后,x、y、temp都会随栈帧销毁。

引用传参的栈帧分析

#include <iostream>
using namespace std;

void swap(int &x, int &y){
    int temp;
    temp  = x;
    x = y;
    y  = temp;    
}

int main(){
    int i1 = 3, i2 = 7;
    swap (i1,i2);
    return 0;
}

从C++标准语义来说,引用是变量的"别名",它本身不是一个独立的对象——标准没有强制要求必须在栈上为引用创建单独存储。但从实际编译器实现的角度,多数场景下会用类似指针的逻辑处理引用:

  • 调用swap函数时,swap的栈帧中通常会创建两个和指针大小相同的隐藏变量,它们被初始化为i1和i2的内存地址。
  • 和指针不同的是,编译器会在编译阶段把所有对引用x、y的操作直接转换为对原变量i1、i2的内存操作,无需手动写解引用语法(比如*x)。
  • swap栈帧中的temp变量会在函数结束时销毁;如果编译器创建了上述隐藏变量,它们也会随栈帧一同销毁。

当然也存在特殊情况:如果编译器能通过优化确定引用的目标(比如引用的是局部变量且全程可追踪),可能会跳过创建隐藏指针,直接操作原变量的内存,此时栈上不会为引用创建额外变量。但这种优化属于编译器行为,不会改变引用的核心语义。

总结引用传参的栈帧关键点:

  • 语义层面,引用是原变量的别名,并非独立对象。
  • 实现层面,多数场景下栈上会创建存储原变量地址的隐藏指针,但代码中无法直接感知。
  • 函数执行完毕后,栈帧内的临时变量(含可能存在的隐藏指针)会被销毁,原变量i1、i2仍保留在main函数的栈帧中。

内容的提问来源于stack exchange,提问作者user18092857

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:39:20