- 此问题在此处已有答案**:
By-reference / by-pointer in assembly code(5个答案)
C++ assembler output - how are references implemented(3个答案)
Why does clang produce inefficient asm with -O0 (for this simple floating point sum)?(1个答案)
十小时前关门了。
在下面的代码中,
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 link。
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]
后,我想这可能是因为前半部分(eax)存储了值address,但当我创建第三个函数时,将char &作为参数,它也创建了8字节空间。Godbolt Link
有什么理由吗?
1条答案
按热度按时间7rtdyuoh1#
如果不能优化,引用通常在底层实现为指针,指针在64位模式下为8字节