2017-02-09 14 views
-4

Является ли ссылка скомпилирована как обычный указатель или у нее есть другой материал?Как ссылка ссылается на asm в gcc?

И как он отличается от clang?

+4

Почему бы не сделать простую тестовую программу, построить ее с разными компиляторами и посмотреть на сгенерированный код? –

+0

В сложных ситуациях это может различаться – ska

+2

Иногда в сгенерированном коде иногда даже не нужно существовать, поскольку компилятор может просто рассматривать его как псевдоним ссылочного элемента. –

ответ

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 
0

Как ссылка переводит на ассемблере в gcc?

В целом: От этого зависит.

Чтобы узнать это в конкретном случае, вы можете протестировать, прочитав сгенерированную сборку.

Является ли ссылка скомпилирована как обычный указатель или у нее есть другие вещи позади?

Реализация кода с использованием ссылки практически идентична реализации с использованием указателя для достижения идентичной косвенности. Как каждый реализован, не гарантируется стандартом, но нет необходимости в их реализации по-разному.

Ссылки отличаются от указателей тем, что им разрешено использовать по правилам C++. Конечно, поскольку правила разные, указатели могут использоваться таким образом, что ссылки не могут. И в таком случае вы не можете сравнить, создают ли указатели одну и ту же сборку.

Ограничение ссылки может сделать некоторые оптимизации легче, так что может быть разницей, но такая оптимизация была бы также возможно с указателями, так что нет никакой гарантии различной мощности сборки при использовании ссылок вместо указателей.

И как он отличается от clang?

В целом: От этого зависит.

Оба компилятора связаны одними и теми же правилами стандарта. Они могут создавать идентичные сборки или разные. Как сгенерированная сборка конкретной версии одного компилятора отличается (если вообще) от сборки, сгенерированной конкретной версией другого компилятора, с конкретными параметрами компиляции для каждого, в конкретной архитектуре процессора в конкретной операционной системе, в конкретном случае использования ссылка, может быть найдена путем проверки и сравнения сгенерированной сборки в каждом конкретном случае.

 Смежные вопросы

  • Нет связанных вопросов^_^