Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
142 / 20 / 2
Регистрация: 07.01.2016
Сообщений: 230

Передача аргументов в функцию

20.06.2019, 10:36. Показов 1679. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый день, хочу спросить, стоит ли вот так перегружать функции?:
C++
1
2
void setX(const int& x); // Для передачи ссылки на переменную
void setX(int&& x);      // Для передачи литерала
Или просто лучше оставить:
C++
1
void setX(const int x);
Выиграет ли первый вариант по производительности?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2019, 10:36
Ответы с готовыми решениями:

Передача аргументов в функцию
Доброго всем дня! Я немного не понял листинг программы из учебника Р.Лафоре: #include"stdafx.h" ...

Передача аргументов в функцию
При сборке кода выдает ошибку (её я написал в комментарий). Что значит ошибка? #include <iostream> #include <math.h> ...

Передача аргументов в функцию
Что сработает быстрее? void Func(const A &a = A(0, 0, 0)) { } или void Func(A a = A(0, 0, 0))

10
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.06.2019, 10:41
Лучший ответ Сообщение было отмечено dpytaylo как решение

Решение

Цитата Сообщение от dpytaylo Посмотреть сообщение
Выиграет ли первый вариант по производительности?
Проиграет.

Цитата Сообщение от dpytaylo Посмотреть сообщение
Или просто лучше оставить:
Лучше. И const в общем-то тоже не нужен.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.06.2019, 10:45
Цитата Сообщение от dpytaylo Посмотреть сообщение
Добрый день, хочу спросить, стоит ли вот так перегружать функции?:
Для int и других базовых типов особого смысла нет. Для классов и структур - стоит
1
142 / 20 / 2
Регистрация: 07.01.2016
Сообщений: 230
20.06.2019, 10:47  [ТС]
DrOffset, oleg-m1973, спасибо)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.06.2019, 11:25
dpytaylo, Если вы программируете для x86_64, то вам следует знать следующее:
Цитата Сообщение от Windows
The Microsoft x64 calling convention is followed on Windows and pre-boot UEFI (for long mode on x86-64). It uses registers RCX, RDX, R8, R9 for the first four integer or pointer arguments (in that order), and XMM0, XMM1, XMM2, XMM3 are used for floating point arguments. Additional arguments are pushed onto the stack (right to left).
Цитата Сообщение от Sys V
The calling convention of the System V AMD64 ABI is followed on Solaris, Linux, FreeBSD, macOS, and is the de facto standard among Unix and Unix-like operating systems. The first six integer or pointer arguments are passed in registers RDI, RSI, RDX, RCX, R8, R9 (R10 is used as a static chain pointer in case of nested functions), while XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 and XMM7 are used for certain floating point arguments. As in the Microsoft x64 calling convention, additional arguments are passed on the stack
Т.е. нет никакого смысла, и даже вредно, передавать как минимум первые четыре аргумента или один, но меньший или равный совокупному размеру как минимум 4х регистров не по значению.
Например, если у вас структура из двух целочисленных полей, например std::pair<int, int>, то ее можно и нужно передавать по значению, т.к. компилятор раскидает эти поля по регистрам (в случае std::pair<int, int> значение всей структуры будет передано в одном регистре). Если вы будете передавать ее по ссылке, то получите лишнюю косвенность на обращении к значениям (ссылка под капотом реализуется как указатель - получаем разыменование указателя на каждом обращении). Все это справедливо, если функция не-inline, в случае выполнимого inline компилятор, как правило, сможет убрать косвенность, подставив непосредственное значение вместо ссылки.

Пример: https://godbolt.org/z/eHn2dY

Если интересны подробности, можете почитать вот этот документ: https://software.intel.com/sit... 64-abi.pdf (для винды подобного документа нет, но там ситуация очень похожа).

Добавлено через 14 минут
Добавлю, что все вышесказанное справедливо для типов с тривиальным копированием. Если в деле типы с нетривиальными конструкторами копирования, то рекомендации насчет ссылок остаются в силе.
6
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
20.06.2019, 13:00
А чаем отличается числовой литерал от переменной?
И тот и тот , смотрю в книжке, пишут как
X = 10

Добавлено через 1 час 16 минут
Вот в документации Microsoft
C++
1
int i = 157;   // Decimal literal
Если это литерал, что же такое простая переменная I?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.06.2019, 13:03
alexbmd, литерал - это циферка 157 в этом коде. А переменная i инициализируется значением этой циферки.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
20.06.2019, 15:35
хорошо как тогда вызывать каждую из этих функци ?
C++
1
2
void setX(const int& x); // Для передачи ссылки на переменную
void setX(int&& x);      // Для передачи литерала
первую
C++
1
2
int x=10;
setX(x);
а вторую ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.06.2019, 15:37
Цитата Сообщение от alexbmd Посмотреть сообщение
а вторую ?
setX(std::move(x));
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.06.2019, 16:19
alexbmd, для литерала автор предполагал вызывать так:
C++
1
setX(10);
тут выражение 10 порождает временный объект (переменную) со значением 10. перегрузка разрешается в пользву версии с int &&
2
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
22.06.2019, 11:46
Елки палки как у вас вся это информация помещается в голове. Восхищаюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2019, 11:46
Помогаю со студенческими работами здесь

Передача аргументов в функцию
Хочу размерность массива задать в отдельной функции, но не получается разобраться с передачей аргументов. Поясните, а то самому пока не...

Передача аргументов в функцию
Привет! Пишу одну программку , и , собственно , уже написал , но код у меня в ней повторяется много , решил попробовать вынести в...

Передача аргументов в функцию
Прошу помощи в разборе багов кода. Ошибка при компиляции связана с неверной передачей аргументов в функцию. Но я никак не пойму , в чём...

Передача аргументов в функцию
как передать аргумент в функцию по указателю? нашел только по значению: int sqr(int x); int main() { int t=10; ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru