|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||||||
Накладные расходы std::function, std::bind, анонимные функции06.07.2023, 15:20. Показов 1360. Ответов 11
Метки нет (Все метки)
Здравствуйте,
Позвольте два вопроса: 1)Подскажите пожалуйста, вот на таком просто примере:
Если так, то можно ли предположить, что в тех случаях, когда удобно применить такое связывание - попытка реализовать это напрямую обычными функциями все равно в итоге привела бы к таким же "накладным расходам" ? 2)Если мне нужно чтобы условный пользователь вызвал мою функцию в конкретном участке кода, то мне тогда придется поместить std::function в какой то контейнер и этот контейнер поместить в нужный участок кода откуда и вызывать "указатели на функции или методы классов". Но вот проблемка: Предположим мне с сервера приходят данные и я их условно помещаю/добавляю в std::string. Так как передавать строку и в итоге большую строку функцию по значению - это минимум странно, то, в функции my_func - принимается по ссылке. Но вот такая ситуация: s
То есть я добавил в вектор отложенные вызовы функции, но во всех этих отложенных вызовах my_string передан по ссылке и в итоге, если может случится так, что к примеру, когда я начну доставать из вектора первый указатель на функцию и вызывать функцию к этом моменту уже придет третий пакет данных с сервера и обновит мою строку и в итоге функция вызовется не с теми данными строки. Однако передавать строку в функцию по значению глупо и вот как быть не знаю.
0
|
|||||||||||
| 06.07.2023, 15:20 | |
|
Ответы с готовыми решениями:
11
Как можно еще использовать std::placeholders вне в связки с std::bind? В чем отличия между std::cref() и std::bind()? |
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||||||
| 06.07.2023, 16:01 | |||||||||||
|
Как минимум пункт 2 легко проверить:
код
Выводит: 1 -A- 2 -B- 3 -C- т.е. не смотря на ссылки корректно запоминается "окружение" в момент добавления лямбды в контейнер. Как оно это делает - для меня полная загадка. Причем функции реально выполняются на самом деле "потом", в цикле for, а не сразу. Вот пример про это.
Добавил глобальную переменную.
1 ZZZ -A- 2 ZZZ -B- 3 ZZZ -C- т.е. выводится значение глоб. переменной на момент for, на момент реального вызова функции
1
|
|||||||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||
| 06.07.2023, 16:14 [ТС] | |||||||
|
Я не правильно привел вызов std::bind: Аналог анонимно функции, которая захватывает my_string по ссылке будет:
То есть std::bind создавала временную копию my_string, теперь же хранит только ссылку на my_string.
0
|
|||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 06.07.2023, 16:30 | |
|
Optimus11,
1) да 2) если действительно нужна копия, то не глупо (возможно копия не нужна, а нужен move)
2
|
|
|
Комп_Оратор)
|
|
| 06.07.2023, 16:34 | |
|
Лямбда и bind это способы создать функтор и его объект. Если в конструктор передаётся константная ссылка, то это не значит что поле объекта будет инициализированно как ссылка, кроме случая, когда оно само является константной ссылкой. Иначе оно инициализирутся копированием.
А если вы передаёте std::reference, то поле будет создано и инициализировано как std::reference. Накладные расходы от сохранения вызова в объекте функтора в другом. Они заключаются в создании объекта функтора. Я когда-то экспериментировал на эту тему немного. В блоге: https://www.cyberforum.ru/blog... g4325.html
1
|
|
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
|
|||
| 06.07.2023, 21:47 | |||
std::function<> - совсем другое дело. std::function<> привносит накладные расходы времени выполнения, которые в общем случае исключить невозможно.Поэтому вопрос в том, о чем именно ваш вопрос. Вы как будто не совсем разделяете лямбды и std::function<>, хотя на самом деле это совершенно разные вещи.std::bind "напрямую обычными функциями"?
1
|
|||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||
| 06.07.2023, 21:57 [ТС] | |||||||
0
|
|||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 08.07.2023, 15:30 | |
|
Optimus11, так и чем кончилось дело?
0
|
|
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 08.07.2023, 17:23 [ТС] | ||
![]() Я просто решил, что использование std::function вместе с лямбдой слишком удобно, чтобы их не использовать, особенно, если вызовов таким образом функций будет не много.
0
|
||
|
Комп_Оратор)
|
||
| 08.07.2023, 18:20 | ||
|
1
|
||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,180
|
||
| 08.07.2023, 18:50 | ||
operator (). Это просто "ручная" реализация лямбды, т.е. closure-объекта. Никакой разницы в эффективности с обычной лямбдой здесь не будет, если не вмешаются какие-то глюки-недоделки-странности конкретного компилятора.Еще раз: 1. Накладные расходы лямбды/closure-объекта равны нулю. (Разумеется, в рамках понимания того, что расходы на захват того, что вам нужно захватить, накладными не являются.) Более того, функциональность лямбды является полностью анализируемой на этапе компиляции, в т.ч. полностью встраиваемой (inline), т.е. анализируемой после погружения в контекст окружающего кода. 2. В ситуации, когда вам нужен захват, сравнивать лямбды с обычными функциями неправомерно, ибо обычные функции не поддерживают захвата. 3. std::function<> - это отдельная надстройка над всеми вызываемыми (callable) сущностями, которая привносит свои накладные расходы. Сведение всех вызываемых сущностей к "общему знаменателю" как правило требует применения полиморфизма времени выполнения, то влечет за собой неустраняемые накладные расходы. При очень локальном использовании std::function<> умный компилятор возможно сможет исключить эти расходы, но в общем случае устранить их не получится.
2
|
||
|
Комп_Оратор)
|
|||||||
| 09.07.2023, 21:00 | |||||||
0
|
|||||||
| 09.07.2023, 21:00 | |
|
Помогаю со студенческими работами здесь
12
Какая реализация лучше? std::pointer_to_binary_function vs std::function Использование std::function в std::thread
Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|