在下面的代码中,
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
当我检查Godbolt链接中的汇编代码时。
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
reference参数创建一个8字节的空间QWORD PTR [rbp-8], rdi
而不是在第二个函数DWORD PTR [rbp-4], edi
中的4字节在firstFunction(int&):
的第6行看到eax, DWORD PTR [rax]
后,我认为这可能是因为前半部分(ax)存储了值地址,但当我创建第三个函数时,有char&作为参数,它还创建8字节空间。Godbolt链接
这有什么原因吗?
如果不能优化的话,引用通常作为指针在底层实现,指针在64位模式下为8字节