Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 34

function против указателей и ссылок на функции

19.06.2022, 11:51. Показов 1842. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть код:
C++
1
2
3
4
5
    void (*p)() = foo;
    p();
 
    function<void()> f = foo;
    f();
Вопрос - чем отличается указатель (или ссылка) на функцию от объекта function? Зачем это добавили?

Благодарю за ответы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2022, 11:51
Ответы с готовыми решениями:

Особенности использования указателей и ссылок в C++ при возврате из функции
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

Использование ссылок и указателей
Добрый вечер Помогите разобраться и понять «Использование ссылок и указателей» Прочел много литературы но понять сложно Объясните...

Сравнение указателей и ссылок.
Не совсем так для них компилятор вырабатывает разный ассемблерный код int main() { //mov dword ptr , 18h; int dwC=24; ...

15
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
19.06.2022, 12:04
с++ не знаю, но возможно, первое - это легаси из Си.

C
1
2
void (*p)() = foo;
p();
0
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 34
19.06.2022, 14:56  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
с++ не знаю, но возможно, первое - это легаси из Си.
да так весь С++ наследие Си)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
19.06.2022, 14:58
Можно перейти на раст Который как с++ без си.
0
Модератор
Эксперт Java
 Аватар для alecss131
2841 / 1350 / 403
Регистрация: 11.08.2017
Сообщений: 4,307
Записей в блоге: 2
19.06.2022, 15:05
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
первое - это легаси из С
По сути так и есть. И желательно это легаси использовать только при общении с Сишным кодом и все.
Вроде лямбду с захватом нельзя представить в виде легаси ссылки
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2022, 16:37
Лучший ответ Сообщение было отмечено ahx666 как решение

Решение

Цитата Сообщение от ahx666 Посмотреть сообщение
Вопрос - чем отличается указатель (или ссылка) на функцию от объекта function?
указатель (или ссылка) на функцию отличаются от объекта function тем,
что указатель (или ссылка ) на функцию - это укзатель (или ссылка) на функцию,
а объект function - это объект function

Цитата Сообщение от ahx666 Посмотреть сообщение
Зачем это добавили?
std::function добавили для возможности опосредованного вызова любых callable,
где callable - любые сущности, которые можно вызывать подобно функциям:
- функции (или ссылки/указатели на них)
- методы классов(или указатели на них)
- лямбды (или функторы)

пример:

https://rextester.com/IXWMH15217

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <functional>
 
void foo() { std::cout << "call foo()...\n"; }
 
struct some
{
  void foo() const  { std::cout << "call obj.foo()...\n"; }    
};
 
struct functor
{
  void operator()() const  { std::cout << "call functor()...\n"; }    
};
 
 
int main()
{
    const some obj;
    const functor func;
    const std::function<void()> call_foo = foo;    
    const std::function<void()> call_functor = func;
    const std::function<void()> call_lambda = [] { std::cout << "call lambda()...\n"; };
 
    const std::function<void()> call_method1 = std::bind(&some::foo, &obj);    
    const std::function<void(const some&)> call_method2 = &some::foo;
    
    call_foo();
    call_functor();
    call_lambda();
    call_method1();
    call_method2(obj);    
}
Добавлено через 10 минут
Цитата Сообщение от ahx666 Посмотреть сообщение
да так весь С++ наследие Си)
у тебя ошибка в логике.
С++ унаследовал у языка си, а не наоборот.

вероятно, ты имел ввиду:
- "да так весь си - наследние с++"
2
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,189
19.06.2022, 16:55
Лучший ответ Сообщение было отмечено ahx666 как решение

Решение

Цитата Сообщение от ahx666 Посмотреть сообщение
Вопрос - чем отличается указатель (или ссылка) на функцию от объекта function?
Тем, что std::function может служит оболочкой не только для функций, а для любых "вызываемых" через оператор () сущностей, т.е. в том числе и для функциональных объектов, а также для указателей на методы классов. (При использовании с указателями на методы классов std::function делает явным неявный параметр this.)

Для того, чтобы стянуть в один интерфейс std::function такие разные по своей природе сущности, std::function вынужден использовать какую-то технику "type erasure", за что приходится платить более-менее существенными накладными расходами. То есть std::function является относительно тяжелым и относительно медленным объектом, по сравнению тем сущностями, которые он оборачивает. В частности: по сравнению с "голыми" указателями на функции.

Цитата Сообщение от ahx666 Посмотреть сообщение
Зачем это добавили?
Вот для этого это и добавили: чтобы свести множество совершенно разных типов к одному. Это дорого и неэффективно, но когда это нужно - это нужно.
1
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 34
20.06.2022, 08:37  [ТС]
Огромное спасибо всем за ответы.
Цитата Сообщение от hoggy Посмотреть сообщение
у тебя ошибка в логике.
С++ унаследовал у языка си, а не наоборот.
вероятно, ты имел ввиду:
- "да так весь си - наследние с++"
Ошибки нет. Я написал, что С++ это наследие языка Си. Проще говоря class С++ : public Си =)

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вот для этого это и добавили: чтобы свести множество совершенно разных типов к одному. Это дорого и неэффективно, но когда это нужно - это нужно.
Т.е. в С++ имеет смысл использовать старые добрые указатели или ссылки на функции?
А function (или auto) использовать только если иначе не получается?
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,991
20.06.2022, 08:42
ahx666, C++ был разработан с оглядкой на Си, но это разные языки
0
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 34
20.06.2022, 08:54  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
C++ был разработан с оглядкой на Си, но это разные языки
да, так и есть
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.06.2022, 09:13
Цитата Сообщение от ahx666 Посмотреть сообщение
Ошибки нет. Я написал, что С++ это наследие языка Си.
вдумайся в значение слова "наследие".

язык с++ никак не может быть наследнием языка си,
потому что потомок никак не может быть наследием предка.

Цитата Сообщение от ahx666 Посмотреть сообщение
Проще говоря class С++ : public Си
это какой то набор букв.
0
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 34
20.06.2022, 09:26  [ТС]
Давайте не будем вдаваться в полемику не по теме
Цитата Сообщение от ahx666 Посмотреть сообщение
Т.е. в С++ имеет смысл использовать старые добрые указатели или ссылки на функции?
А function (или auto) использовать только если иначе не получается?
А что вы думаете по поводу этих двух вопросов?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.06.2022, 10:20
Лучший ответ Сообщение было отмечено ahx666 как решение

Решение

Цитата Сообщение от ahx666 Посмотреть сообщение
А что вы думаете по поводу этих двух вопросов?
На эти вопросы нет ответа - что лучше подходит, то и используйте.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,189
20.06.2022, 16:02
Цитата Сообщение от ahx666 Посмотреть сообщение
А function (или auto) использовать только если иначе не получается?
Почему function свален в одну кучу с auto? Что имеется в виду?

Первоочередным соображением всегда будет функциональность, т.е. вопрос того, что именно вам нужно/хочется получить. Во многих случаях это ограничит выбор единственным вариантом. Поэтому о всяких "только если иначе не получается" речи вообще не зайдет.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.06.2022, 16:18
Цитата Сообщение от ahx666 Посмотреть сообщение
Т.е. в С++ имеет смысл использовать старые добрые указатели или ссылки на функции?
Да. Простая логика - function<void()> f имеет фиксированный размер. Лямбда которую туда пытаются запихать имеет произвольный размер, потому что хомячит внутри себя захваченные этой лямбдой переменные. Очевидно, чтобы лямбду произвольного размера упихать в размер фиксированный, где-то в недрах function придется спрятать динамическую память. А это уже накладные расходы.

Но, разумеется, если вы будете использовать указатели и ссылки, то и лямбду туда не сунешь, по упомянутым выше причинам.
Цитата Сообщение от ahx666 Посмотреть сообщение
А function (или auto) использовать только если иначе не получается?
В auto вышеупомянутые проблемы разрешаются на стадии компиляции. Поэтому, если лямбда пихается в auto, накладных расходов на стадии исполнения программы уже не будет.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.06.2022, 17:25
Croessmah, чем тебе раст не нравится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2022, 17:25
Помогаю со студенческими работами здесь

Касательно указателей и ссылок.
Цитирую фразу из популярной ныне книги Айвора Хортона. &quot;Никогда не возвращайте из функции ссылку на локальную переменную&quot; Так вот....

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Ступор в возврате указателей и ссылок
Изучаю С++ базовый курс от Шилтда, все проходил на твердую четверку, и на предпоследней теме про системы ввода-вывода абсолютно запоролся...

Совместное использование указателей и ссылок
int *ptr; int &amp;ref = *ptr; ref = 1; Вот и весь вопрос. Ничего плохого в этом нет?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
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