f(int i) vs f(const int& i)
есть ли смысл в f(const int& i) ?
Ответ
В случае int нет никакого - потому что указатель может быть "длинее". Сам инт обычно 32бита, а указатель может быть от 32 до 64 бит (в зависимости от платформы и компилятора). Потестируйте, я думаю, что разницы не будет, возможно, даже второй вариант окажется медленее.
Посмотрим код по факту
int f1(int a) {
return a*a;
}
int f2(const int &a) {
return a*a;
}
и результат
f1(int): # @f1(int)
imull %edi, %edi
movl %edi, %eax
retq
f2(int const&): # @f2(int const&)
movl (%rdi), %eax
imull %eax, %eax
retq
код очень похожий, но в первом случае компилятор смог подставить значение сразу с регистра. В втором случае он вставляет ещё загрузку с памяти. Нужно конечно смотреть в мануалы, но если бы это был старый процессор виду 286-386, то первый вариант работал бы быстрее. (да, значние в регистр нужно ещё занести, но компилятор может больше творить).
А вот если вместо int сложный объект, с сложным конструктором, выигрыш может быть очень существенный. Ведь нужно копировать объекты, освобождать память и многое другое.
В моей практике был случай, когда в функцию передавалось два аргумента, которые были просто int a[4]. Сделав указанную выше оптимизацию, я получил около 20 раз ускорение (да, функция была небольшой и очень часто вызывалась).
Комментариев нет:
Отправить комментарий