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

ujv3wf0j  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(178)
    • 此问题在此处已有答案**:

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
有什么理由吗?

7rtdyuoh

7rtdyuoh1#

如果不能优化,引用通常在底层实现为指针,指针在64位模式下为8字节

相关问题