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

为何C++引用参数(如int&)占用8字节内存,值参数仅占4字节?

为什么C++中引用参数总是占用8字节栈空间?

问题代码

int firstFunction(int& refParam)
{
    std::cout << "Type of refParam is: " << typeid(refParam).name() << '\n';
    return refParam;
}

int secondFunction(int param)
{
    std::cout << "Type of param is: " << typeid(param).name() << '\n';
    return param;
}

int main()
{
    int firstVar{ 1 };
    int secondVar{ firstFunction(firstVar) };
    int thirdVar{ secondFunction(firstVar) };
}

控制台输出

int
int

对应汇编代码

firstFunction(int&):
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     rax, QWORD PTR [rbp-8]
        mov     eax, DWORD PTR [rax]
        pop     rbp
        ret
secondFunction(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret

问题核心

观察到引用参数(如int&)在栈上占用8字节空间,而值参数(如int)仅占用4字节;即使是char&作为参数,同样会占用8字节空间,这一现象的原因是什么?

解答

核心原因是在x86_64架构下,主流C++编译器(如GCC、Clang)会用指针实现引用,而x86_64平台的指针长度固定为8字节,与引用的对象类型无关。

具体细节:

  • C++标准并未强制规定引用的实现方式,但工业界主流编译器都选择用指针来模拟引用的行为:传递引用参数时,实际传递的是被引用变量的内存地址。
  • 栈上为这个指针分配的空间就是8字节(对应汇编中的QWORD类型,即64位数据),所以不管引用的是int、char还是其他任何类型,栈空间占用都是8字节。
  • 值传递则是直接拷贝变量的实际值到栈上,所以占用空间等于变量本身的类型大小:比如int是4字节,char是1字节。
  • 至于typeid(refParam).name()输出int而非指针类型,是因为typeid识别的是引用的静态类型(即被引用对象的类型),而非编译器底层实现的指针类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:01:00