C ++: любая большая разница в _implementation_ ссылки и указателя - PullRequest
0 голосов
/ 12 октября 2011

Я понял, что использую ссылки, не понимая, как они на самом деле работают (поэтому я использую их не так часто).

Кажется, что указатель реализован просто как-то так: простая переменная WORD с адресом некоторого другогопеременная.Мы копируем его, когда передаем в качестве параметра функции.

И что происходит, когда мы передаем ссылку в качестве параметра?Тот же старый способ?

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

У этих двоих не так много общего, как вы думаете, на самом деле.

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

Указательгораздо ближе к металлу.Это переменная, которая хранит адрес.

2 голосов
/ 12 октября 2011

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

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

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