2014-07-07 3 views
0

Есть ли ценна разница в производительности между этим:Передача ссылки const: увеличение производительности?

int myFunction(const int &a) { return 2 + a; } 

и это:

int myFunction(int a) { return 2 + a; } 

?

Насколько мне известно, второй метод делает копию переменной, переданной в качестве аргумента, в новый регистр, и это требует еще нескольких инструкций в коде asm. То, что эта функция называется тысяча раз в секунду, и производительность в этом случае имеет решающее значение, лучше ли передавать ссылку на const, а не переменную?

+0

Вы посмотрели это? Вы не первый, кто спрашивает об этом – Samuel

+0

. «Есть ли какая-то ценная разница в производительности между этим:« Очень маловероятно. –

+0

На самом деле хороший оптимизирующий компилятор, вероятно, встроит обе функции в письменном виде. В противном случае передача по ссылке обычно осуществляется с помощью указателей, которые не меньше, чем 'int' (и фактически больше в 64-битных системах). –

ответ

2

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

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

+0

И по значению, и по ссылке эффективны, так как оба они имеют желаемый эффект. –

5

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

Но ваш довод - это нонсенс. Вот что наивная реализация двух будет делать:

1: int myFunction(const int &a) { return 2 + a; }
Пропускают адрес a. Получите значение с этого адреса. Добавьте два к нему. Верни это.

2: int myFunction(int a) { return 2 + a; }
Оценка: a. Добавьте два к нему. Верни это.

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

За тысячу звонков в секунду это не будет иметь большого значения. Но для более сложных случаев, когда компилятор не может сразу увидеть все, стандартная практика пропускает «маленькие» типы по значению. Вы только хотите пройти по ссылке, когда стоимость дополнительной косвенности меньше стоимости копирования значения.

+0

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

+0

@NeilKirk Это верно. Для более сложных случаев, безусловно, может быть важно, какую из этих двух вещей вы делаете. –

+0

+1 чувак это Ответ намного лучше, даже из ответов в дубликате. – 101010

1

Обычно определение второй функции более эффективно, чем первое, поскольку в первом определении функции используется косвенная ссылка на аргумент.

Смежные вопросы