Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Передача интегральной переменной в функцию: по значению или по ссылке?

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 раз ускорение (да, функция была небольшой и очень часто вызывалась).

Комментариев нет:

Отправить комментарий