Если компилятору известно, что ссылка всегда ссылается на один конкретный объект / элемент, то компилятор, безусловно, может оптимизировать косвенное указание.
Однако большинство ссылок фактически связаны во время выполнения. Даже если конкретный экземпляр ссылки не может быть восстановлен, разные исполнения конкретной области или разные экземпляры объекта, который содержит ссылочные элементы, могут выполняться со ссылкой, связанной с различным объектом для каждого из этих экземпляров. Использование косвенного обращения - удобный способ для компилятора справиться с этим.
Ситуация, когда ссылка только когда-либо связана только с одной вещью, может быть достаточно редкой, чтобы компиляторы не искали оптимизацию - тем более, что в большинстве случаев оптимизация не была бы заметной выгодой.
Кроме того, я подозреваю, что вы не включаете оптимизацию компилятора - используя свой код и вызывая различные функции с y
и i
и их адресами, быстрый тест в VC ++ 2005 с оптимизацией показывает, что компилятор не реализация i
в качестве указателя, но в качестве истинного псевдонима для y
(т. е. всякий раз, когда передается i
или &i
, компилятор использует адрес y
напрямую).
Если вы смотрите на отладочный вывод компилятора, вас не должно удивлять, что он всегда обрабатывает ссылку как указатель за кулисами.