引用是否被编译为通常的指针,或者它还有其他东西?
铿锵有什么不同?
答案 0 :(得分:1)
您可以将引用视为在使用时自动取消引用的不可变指针。这不是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);
}
gcc
和clang
在没有启用任何优化的情况下为函数生成相同的代码:
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
答案 1 :(得分:0)
引用如何转换为gcc中的asm?
总的来说:这取决于。
要在特定情况下找到它,您可以通过读取生成的程序集进行测试。
引用是否被编译为通常的指针,或者它还有其他东西?
使用引用的代码实现与使用指针实现相同间接的代码实现相同。标准不保证每种方法的实施方式,但不需要以不同的方式实施它们。
引用仅与C ++规则允许使用它们的指针不同。当然,因为规则不同,指针可以以引用不能的方式使用。在这种情况下,您无法比较指针是否生成相同的程序集。
参考的限制可能使一些优化变得更容易,因此可能存在差异,但这样的优化也可能是可能的指针,所以没有使用引用而不是指针时保证不同的程序集输出。
铿锵有什么不同?
总的来说:这取决于。
两个编译器都遵循相同的标准规则。它们可能会生成相同的组件或不同。生成的一个编译器的特定版本的程序集(如果有的话)与另一个编译器的特定版本生成的程序集有所不同,特定操作系统上的特定处理器体系结构中每个编译器的特定编译选项,在特定的用例中通过检查和比较每个特定情况下生成的装配,可以找到参考文献。