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

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

20.06.2019, 10:36. Показов 1636. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru