Ссылки на переменную (Искажают) incure стоимость времени выполнения?

Возможно, это - компилятор определенная вещь. Если так, как насчет для gcc (g ++)? Если Вы используете ссылку на переменную/, искажают как это:

int x = 5;
int& y = x;
y += 10;

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

int x = 5;
x += 10;

Другими словами, машинный код изменяется, или "псевдоним" происходит только на уровне компилятора?

Это может походить на немой вопрос, но мне любопытно. Особенно в случае, где, возможно, было бы удобно временно переименовать некоторые членские переменные именно так, которые математический код немного легче считать. Несомненно, мы точно не говорим об узком месте здесь..., но это - что-то, что я делаю и таким образом, я просто задаюсь вопросом, существует ли какое-либо 'фактическое' различие... или если это является только косметическим.

13
задан tshepang 14 May 2014 в 20:46
поделиться

5 ответов

Его можно рассматривать как псевдоним, но не с точки зрения эффективности. Под капотом ссылка - это указатель с более приятным синтаксисом и более высокими гарантиями безопасности. Следовательно, у вас есть штраф во время выполнения операции "разыменования". ЕСЛИ компилятор не оптимизирует его, но обычно я бы не стал на это рассчитывать.

В случае вопроса, оптимизирует компилятор или нет, нет другого пути, кроме как посмотреть на сгенерированную сборку.

11
ответ дан 1 December 2019 в 20:56
поделиться

Да, разыменование указателя за ссылкой влечет за собой дополнительные затраты времени выполнения, но, скорее всего, они незначительны. Пишите код так, чтобы он был наиболее понятен для чтения и наиболее четко формулировал семантику, к которой вы стремитесь, а затем запустите профилировщик, если производительность является проблемой (узкое место редко оказывается тем, о чем вы догадываетесь). Если вы работаете на MacOS, Shark - просто фантастика.

0
ответ дан 1 December 2019 в 20:56
поделиться

Обе эти функции компилируются в один и тот же код в 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
4
ответ дан 1 December 2019 в 20:56
поделиться

Верно, что в большинстве случаев ссылки реализуют концепцию «псевдонима», альтернативного имени для объекта, с которым они связаны.

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

Ваш пример - один из тех, когда вы не должны ожидать снижения производительности от ссылки.

5
ответ дан 1 December 2019 в 20:56
поделиться

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

4
ответ дан 1 December 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: