Пропуск встроенных аргументов функции

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

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

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

foo(T a, T b)

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

Ответ 1

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

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

Ответ 2

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

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

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

EDIT: я просто посмотрю на машинный код для простой тестовой программы, составленной с помощью GCC 4.6 в ddd. Сгенерированный код казался идентичным, поэтому он, похоже, оптимизирован. Это по-прежнему хорошая практика, хотя для других компиляторов и если ничто иное не дает четкого указания на намерение кода. Также возможны более сложные ситуации, которые компилятор не может оптимизировать.

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

Ответ 3

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

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

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

  • Пример может быть обманным, удаленным -