Передача аргументов встроенной функции - PullRequest
11 голосов
/ 02 октября 2011

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

foo(const T & a, const T &b)

по сравнению со значением

foo(T a, T b)

если я не изменю значения a и b в функции? Рекомендует ли изменение C ++ 11 что-то конкретное здесь?

Ответы [ 3 ]

11 голосов
/ 02 октября 2011

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

Передача примитивных типов по константной ссылке не потребует затрат, когда функция встроена.Но передача сложного lvalue по значению вызовет потенциально дорогой вызов конструктора копирования.Поэтому предпочитайте проходить по константной ссылке (если псевдонимы не являются проблемой).

4 голосов
/ 02 октября 2011

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

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

Используя константную ссылку, вы можете датьэто довольно четкое указание.

РЕДАКТИРОВАТЬ: Я просто взглянуть на машинный код для простой тестовая программа скомпилирована с GCC 4.6 в DDD.Сгенерированный код казался идентичным, поэтому он, похоже, оптимизирован.Это все еще хорошая практика для других компиляторов, и, если ничего не дает четкого указания о намерениях кода.Также возможно, что есть более сложные ситуации, которые компилятор не может оптимизировать.

Также демоверсия llvm онлайн-диссамблера показывает, что там также генерируется идентичный битовый код.Если вы отключите оптимизацию, она будет немного длиннее без ссылки на const.* 1964 байта - без константной ссылки (и без других констант по функциям / параметрам)* 1960 байтов - просто нет константной ссылки, но есть другие.* 1856 байт - с константой и константной ссылкой.

1 голос
/ 02 октября 2011

Передача по ссылке происходит быстрее, чем по значению, в зависимости от типа данных.
Однако для встроенных функций тело функции (и, следовательно, все ссылки / передаваемые значения) добавляются в строку кода, в которой они так или иначе используются технически.переменные не передаются, только несколько строк кода в той же области.

ссылка http://www.cprogramming.com/tutorial/lesson13.html

Существует также очень полезный ответ на вопрос should-i-take-arguments-arguments-to-inline-functions-by-reference-or-value

  • Пример, возможно, вводит в заблуждение, удалено -
...