Является ли ссылка скомпилирована как обычный указатель или у нее есть другой материал?Как ссылка ссылается на asm в gcc?
И как он отличается от clang?
Является ли ссылка скомпилирована как обычный указатель или у нее есть другой материал?Как ссылка ссылается на asm в gcc?
И как он отличается от clang?
Вы можете представить ссылку как неизменяемый указатель, который автоматически отменяется при использовании. Это не то, что говорит стандарт 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
Как ссылка переводит на ассемблере в gcc?
В целом: От этого зависит.
Чтобы узнать это в конкретном случае, вы можете протестировать, прочитав сгенерированную сборку.
Является ли ссылка скомпилирована как обычный указатель или у нее есть другие вещи позади?
Реализация кода с использованием ссылки практически идентична реализации с использованием указателя для достижения идентичной косвенности. Как каждый реализован, не гарантируется стандартом, но нет необходимости в их реализации по-разному.
Ссылки отличаются от указателей тем, что им разрешено использовать по правилам C++. Конечно, поскольку правила разные, указатели могут использоваться таким образом, что ссылки не могут. И в таком случае вы не можете сравнить, создают ли указатели одну и ту же сборку.
Ограничение ссылки может сделать некоторые оптимизации легче, так что может быть разницей, но такая оптимизация была бы также возможно с указателями, так что нет никакой гарантии различной мощности сборки при использовании ссылок вместо указателей.
И как он отличается от clang?
В целом: От этого зависит.
Оба компилятора связаны одними и теми же правилами стандарта. Они могут создавать идентичные сборки или разные. Как сгенерированная сборка конкретной версии одного компилятора отличается (если вообще) от сборки, сгенерированной конкретной версией другого компилятора, с конкретными параметрами компиляции для каждого, в конкретной архитектуре процессора в конкретной операционной системе, в конкретном случае использования ссылка, может быть найдена путем проверки и сравнения сгенерированной сборки в каждом конкретном случае.
Почему бы не сделать простую тестовую программу, построить ее с разными компиляторами и посмотреть на сгенерированный код? –
В сложных ситуациях это может различаться – ska
Иногда в сгенерированном коде иногда даже не нужно существовать, поскольку компилятор может просто рассматривать его как псевдоним ссылочного элемента. –