为什么int&as函数参数使用QWORD(8字节)内存,而int参数使用DWORD



在下面的代码中,

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字节

相关内容

最新更新