Какая разница между уровнями между указателем и ссылкой?

Если у нас есть этот код:

int foo=100;
int& reference = foo;
int* pointer = &reference;

Нет фактической бинарной разницы в справочных данных и данных указателя. (оба они содержат местоположение в памяти foo)

часть 2

Итак, где же все остальные различия между указателями и ссылками (обсуждаются здесь) входят? Использует ли компилятор их или они на самом деле являются разными типами переменных на соответствующем уровне? Другими словами, выполните следующие действия на одном языке ассемблера?

foo=100;
int& reference=foo;
reference=5;

foo=100;
int* pointer=&foo;
*pointer=5;

Ответ 1

Теоретически они могут быть реализованы по-разному.

На практике каждый компилятор, который я видел, компилирует указатели и ссылки на один и тот же машинный код. Различие полностью на уровне языка.

Но, как говорит cdiggins, вы не должны зависеть от этого обобщения, пока не убедитесь, что это верно для вашего компилятора и платформы.

Ответ 2

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

Некоторые люди говорят "по моему опыту... и т.д. и т.д." и т.д. но это более ненадежно, чем вы можете понять. Немногие люди имеют реальный опыт в любом существенном поперечном разрезе всех возможных комбинаций компилятора/архитектуры. [Edit: Я думаю, что Crashworks доказывает, что я ошибаюсь.: -)]

Рассмотрим следующий список компиляторов С++:

  • С++ Builder
  • Turbo С++ Explorer
  • Компилятор С++
  • Borland С++
  • Turbo С++ для DOS
  • Clang
  • Комо C/С++
  • удобная система разработки компиляторов
  • Цифровой Марс
  • DJGPP
  • EDGE ARM C/С++
  • MinGW
  • GCC С++ (g++)
  • HP aС++
  • Компилятор Intel С++
  • МИКРОТЕК
  • MULTI
  • Open Watcom
  • Open64
  • PathScale
  • Рабочая станция PGI
  • ProDev WorkShop
  • Компилятор RealView C/С++ (armcc)
  • SAS/C С++
  • Sun Studio
  • TenDRA
  • VectorC
  • Visual С++
  • VisualAge С++
  • XL C/С++

Теперь умножьте этот список на следующий короткий список машинных архитектур:

  • ARM
  • Atmel AVR
  • Blackfin
  • HC12
  • H8/300
  • IA-32 (x86)
  • x86-64
  • IA-64
  • Motorola 68000
  • MIPS
  • PA-RISC
  • PDP-11
  • PowerPC
  • R8C/M16C/M32C
  • SPU
  • Система /390/zSeries
  • SuperH
  • SPARC
  • VAX
  • A29K
  • ARC
  • ETRAX CRIS
  • D30V
  • DSP16xx
  • FR-30
  • FR-V
  • Intel i960
  • IP2000
  • M32R
  • 68HC11
  • MCORE
  • MMIX
  • MN10200
  • MN10300
  • Motorola 88000
  • NS32K
  • ROMP
  • Stormy16
  • V850
  • Xtensa
  • AVR32

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

Ответ 3

Указатели и ссылки имеют различную семантику в С++, но сгенерированный код тот же.

Ответ 4

Просто чтобы усилить, хотя может быть правдой, что ссылки те же, что и указатели под капотом почти на всех компиляторах, серьезная ошибка зависит от этого поведения. Мало того, что это может укусить вас на заднице, когда вы меньше всего этого ожидаете, но это также неправильное использование ссылок. Если вам нужен указатель, используйте указатель.