引用如何在gcc中转换为asm

How does reference translates to asm in gcc?

本文关键字:转换 asm gcc 引用      更新时间:2023-10-16

引用是像通常的指针一样编译的,还是后面有其他东西?

它的叮当声有何不同?

您可以将引用视为一个不可变的指针,在使用时会自动取消引用。这不是C++标准所说的,所以你不能把它当作一个实际的实现。

但实际上,这可能是你在许多情况下看到的
在参数传递的情况下,以以下示例为例:

#include <stdio.h>
void function (int *const n){
printf("%d",*n);
}
void function (int & n){
printf("%d",n);
}
int main(){
int n = 123;
function(&n);
function(n);
}

gccclang为未启用任何优化的函数生成相同的代码:

function(int*):
push    rbp
mov     rbp, rsp
sub     rsp, 16
mov     QWORD PTR [rbp-8], rdi
mov     rax, QWORD PTR [rbp-8]
mov     eax, DWORD PTR [rax]
mov     esi, eax
mov     edi, OFFSET FLAT:.LC0
mov     eax, 0
call    printf
nop
leave
ret
function(int&):
push    rbp
mov     rbp, rsp
sub     rsp, 16
mov     QWORD PTR [rbp-8], rdi
mov     rax, QWORD PTR [rbp-8]
mov     eax, DWORD PTR [rax]
mov     esi, eax
mov     edi, OFFSET FLAT:.LC0
mov     eax, 0
call    printf
nop
leave
ret

引用如何在gcc中转换为asm?

一般来说:这取决于情况。

要在特定情况下找到答案,可以通过读取生成的程序集进行测试。

引用是像通常的指针一样编译的,还是后面有其他东西?

使用引用的代码实现实际上与使用指针实现相同间接寻址的代码实现完全相同。标准并不能保证如何实现每一个,但没有必要以不同的方式实现它们。

引用与指针的区别仅在于C++规则允许它们使用。当然,由于规则不同,指针的使用方式与引用不同。在这种情况下,您无法比较指针是否生成相同的程序集。

引用的限制可能会使一些优化变得更容易,因此可能会有所不同,但如果使用指针,这种优化也可能是,因此在使用引用而不是指针时,无法保证不同的程序集输出。

它在叮当声中有什么不同?

一般来说:这取决于情况。

两个编译器都受相同的标准规则约束。它们可能生成相同或不同的程序集。在引用的特定用例中,一个编译器的特定版本的生成程序集与另一个编译器特定版本生成的程序集有何不同(如果有的话),每个程序集都有特定的编译选项,在特定操作系统的特定处理器架构上,可以通过在每个特定情况下检查和比较生成的组件来找到。