为何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
相关产品推荐
相关产品推荐

