Как упоминалось в @black, оптимизация зависит от компилятора и платформы. Тем не менее, мы обычно ожидаем, что ряд оптимизаций будет происходить изо дня в день при использовании хорошего оптимизирующего компилятора. Например, мы рассчитываем на функцию встраивании, распределение регистров, преобразование постоянного умножения и деления на битовые сдвиги, когда это возможно, и т.д.
Чтобы ответить на ваш вопрос
бы составители современные x86-64 быть достаточно умны, чтобы передать аргумент приоритета по значению, а не ссылку, если тип приоритета может вписываться в регистр?
Я просто попробую. См для себя:
Это код:
template<typename T>
T square(const T& num) {
return num * num;
}
int sq(int x) {
return square(x);
}
GCC -O3
, -O2
и -O1
надежно выполнить это оптимизация.
Clang 3.5.1, с другой стороны, похоже, не выполняет эту оптимизацию.
Должны ли вы считать на такую оптимизацию? Не всегда, а не совсем - стандарт C++ ничего не говорит о том, когда такая оптимизация может произойти. На практике, если вы используете GCC, вы можете 'ожидать' оптимизации.
Если вы абсолютно уверены, что такая оптимизация произойдет, вы захотите использовать template specialization.
Я подозреваю, что да. Однако, если реализация подвергается воздействию внешних модулей, она должна соответствовать требованиям ABI - в этом случае ссылка является ссылкой. В общем, вы хотите избежать ссылок на примитивы - и есть способы сделать это. – davmac
Я предполагаю, что если экземпляр типа 'T' может вписаться в регистр, компилятор будет проходить по копии. В противном случае он, вероятно, передаст переменную указателем. –
Я сделал простой тест с компилятором clang. Кажется, что компилятор действительно делает оптимизацию. Он в основном генерирует оптимизированную версию (например, встраивание функции или передачу по значению) и версию (которая может быть не использована и просто находится там в коде), которая соответствует требованиям ABI. –