Возможно, это - компилятор определенная вещь. Если так, как насчет для gcc (g ++)? Если Вы используете ссылку на переменную/, искажают как это:
int x = 5;
int& y = x;
y += 10;
На самом деле требуется больше циклов, чем если бы мы не использовали ссылку.
int x = 5;
x += 10;
Другими словами, машинный код изменяется, или "псевдоним" происходит только на уровне компилятора?
Это может походить на немой вопрос, но мне любопытно. Особенно в случае, где, возможно, было бы удобно временно переименовать некоторые членские переменные именно так, которые математический код немного легче считать. Несомненно, мы точно не говорим об узком месте здесь..., но это - что-то, что я делаю и таким образом, я просто задаюсь вопросом, существует ли какое-либо 'фактическое' различие... или если это является только косметическим.
Его можно рассматривать как псевдоним, но не с точки зрения эффективности. Под капотом ссылка - это указатель с более приятным синтаксисом и более высокими гарантиями безопасности. Следовательно, у вас есть штраф во время выполнения операции "разыменования". ЕСЛИ компилятор не оптимизирует его, но обычно я бы не стал на это рассчитывать.
В случае вопроса, оптимизирует компилятор или нет, нет другого пути, кроме как посмотреть на сгенерированную сборку.
Да, разыменование указателя за ссылкой влечет за собой дополнительные затраты времени выполнения, но, скорее всего, они незначительны. Пишите код так, чтобы он был наиболее понятен для чтения и наиболее четко формулировал семантику, к которой вы стремитесь, а затем запустите профилировщик, если производительность является проблемой (узкое место редко оказывается тем, о чем вы догадываетесь). Если вы работаете на MacOS, Shark - просто фантастика.
Обе эти функции компилируются в один и тот же код в g ++
, даже просто используя -O1
]. (Я добавил оператор return
, чтобы гарантировать, что вычисление не исключено полностью.)
Нет указателя, только ссылка. В этом тривиальном примере разницы в производительности не было. Однако это не гарантия того, что так будет всегда (без разницы в производительности) для всех видов использования ссылок.
int f()
{
int x = 5;
x += 10;
return x;
}
.
int f()
{
int x = 5;
int & y = x;
y += 10;
return y;
}
Ассемблер:
movl $15, %eax
ret
Верно, что в большинстве случаев ссылки реализуют концепцию «псевдонима», альтернативного имени для объекта, с которым они связаны.
Однако в общем случае ссылки реализуются через указатели. Тем не менее, хороший компилятор будет использовать фактический указатель для реализации ссылки только в ситуациях, когда фактическая привязка определяется во время выполнения. Если привязка известна во время компиляции (и типы совпадают), компилятор обычно реализует ссылку как альтернативное имя для того же объекта, и в этом случае не будет потери производительности для доступа к объекту через ссылку (по сравнению с доступом к это через его первоначальное имя).
Ваш пример - один из тех, когда вы не должны ожидать снижения производительности от ссылки.
Единственный способ узнать наверняка - это скомпилировать его и проверить вывод компилятора. Как правило, накладные расходы для ссылки аналогичны накладным расходам для указателя, потому что указатели обычно являются тем, как ссылки реализуются. Однако, учитывая простой случай, который вы показываете, я считаю, что ссылка будет оптимизирована.