Какая разница на низком уровне между указателем и ссылкой? - PullRequest
11 голосов
/ 29 октября 2009

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

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;

Ответы [ 4 ]

18 голосов
/ 29 октября 2009

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

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

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

10 голосов
/ 29 октября 2009

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

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

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

  • C ++ Builder
  • Turbo C ++ Explorer
  • Компилятор C ++
  • Borland C ++
  • Turbo C ++ для DOS
  • Clang
  • Comeau C / C ++
  • удобная система разработки компилятора
  • Цифровой Марс
  • DJGPP
  • EDGE ARM C / C ++
  • MinGW
  • GCC C ++ (G ++)
  • HP AC ++
  • Компилятор Intel C ++
  • МИКРОТЕКИ
  • MULTI
  • Открыть Watcom
  • Open64
  • Рабочая станция PGI
  • ProDev WorkShop
  • Компилятор RealView C / C ++ (armcc)
  • SAS / C C ++
  • Sun Studio
  • TenDRA
  • VectorC
  • Visual C ++
  • VisualAge C ++
  • XL C / 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
  • СПУ
  • System / 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

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

1 голос
/ 29 октября 2009

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

0 голосов
/ 29 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...