Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для Everest Alpine
2 / 2 / 0
Регистрация: 10.01.2025
Сообщений: 41

Функции и Прототип функции

07.02.2025, 07:37. Показов 4190. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, читаю книгу С++ Лекции и программирование Стивена Прата. Остановился на 2 главе, где помимо int main(), добавляем свои функции по типу void Simon(int). Я что-то вообще не догоняю, а что дают созданные функции, понял, что есть в библиотеке более 140 функций, но можно и свои создать. Можете объяснить что такое функции и зачем их создают понятным языком
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2025, 07:37
Ответы с готовыми решениями:

Объявление и определение функций, прототип функции, вызов функции, область видимости функции
Функции (объявление и определение функций, прототип функции, вызов функции, область видимости функции, локальные переменные и их...

Куда лучше писать прототип функции, до функции main() или внутри него?
Вопрос тупой, но хочется писать код чуток лучше.

Как написать прототип функции для функции где к параметру присваивается число
Как написать прототип функции для функции где к параметру присваивается число? Код просто не запускается, всё без ошибок и...

38
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
09.02.2025, 11:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Функция и прототип функции - настолько простые и интуитивно понятные сущности, что для того что бы их понять - достаточно один раз прочитать в учебнике.
... понимая при этом, что в С++ "прототип функции" - это слэнговое понятие. Термин "прототип" пришел в С++ из языка С, где он имел существенное формальное значение. В С++ же формально нет "прототипов" вообще, однако мы иногда неформально используем этот термин для обозначения чистых (неопределяющих) объявлений функции.

А с выходом С23 и в языке С термин "прототип" потерял свою ценность. То есть сегодня фактически у него осталось только неформальное слэнговое значение и в С++, и в С.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,589
09.02.2025, 22:11
Цитата Сообщение от Anvis Посмотреть сообщение
если кусок повторяющегося кода используется в разных частях программы более одного раза, его необходимо обернуть в функцию. Скорее всего это сделает код чуть более тормознутым
тормознутым точно не станет.

допустим есть
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
void foo() 
{
    std::cout << 42;
}
 
int main()
{
    foo();
}
без оптимизации

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foo():
        push    rbp
        mov     rbp, rsp
        mov     esi, 42
        mov     edi, OFFSET FLAT:std::cout
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        nop
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        call    foo()
        mov     eax, 0
        pop     rbp
        ret
с оптимизацией

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
foo():
        mov     esi, 42
        mov     edi, OFFSET FLAT:std::cout
        jmp     std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
main:
        sub     rsp, 8
        mov     esi, 42
        mov     edi, OFFSET FLAT:std::cout
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
        xor     eax, eax
        add     rsp, 8
        ret
Произошло то, о чем написал Алексей. Как видишь, call foo() исчез, вместо этого в main были непосредственно встроены:

Assembler
1
2
3
        mov     esi, 42
        mov     edi, OFFSET FLAT:std::cout
        call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
Это значит, что с оптимизацией наш код равносилен

C++
1
2
3
4
5
6
#include <iostream>
 
int main()
{
    std::cout << 42;
}
0
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
09.02.2025, 22:45
Цитата Сообщение от Royal_X Посмотреть сообщение
void foo()
{
    std::cout << 42;
}
У меня нет сомнений, что функция из примера будет встроена в место ее вызова. Но раз уж пошла такая пьянка, было бы интересно узнать, с какого момента оптимизатор начнет понимать, что функцию надо встраивать. Статьи в интернете вообще предлагают не использовать инлайн, ссылаясь на то, что современные компиляторы сами отлично понимают, когда функцию лучше встраивать, и вообще это не модно. Но у меня был некоторый код с приватным методом в несколько десятков строк и 5-6 параметрами на входе, вызываемый в цикле. И после его инлайна программа стала работать заметно быстрее. Само собой, все тяжелое в метод передавалось по ссылкам, и тем не менее я не ожидал, что ускорение будет заметно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,589
09.02.2025, 22:54
Цитата Сообщение от Anvis Посмотреть сообщение
было бы интересно узнать, с какого момента оптимизатор начнет понимать, что функцию надо встраивать
это же зависит от оптимизатора компилятора, уровня оптимизации, тут так сразу не скажешь
Цитата Сообщение от Anvis Посмотреть сообщение
И после его инлайна программа стала работать заметно быстрее.
Ну вообще, на глаз не меряют скорость. Ты время засекал? Никто не мешает смотреть ассемблерный код, полученный конкретным компилятором, который ты используешь. Потому что разные компиляторы по-разному оптимизируют.

Но писать в мейне это не вариант. Так усложнится восприятие и чтение кода...
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
09.02.2025, 23:39
Цитата Сообщение от Royal_X Посмотреть сообщение
Ты время засекал?
Компьютер, вместе с этой задачей, паралельно выполняет кучу других.
(Время выполнения которых неоднозначно)
И такое мерять время, не имеет смысла.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,589
09.02.2025, 23:49
Цитата Сообщение от Наталья8 Посмотреть сообщение
Компьютер, вместе с этой задачей, паралельно выполняет кучу других.
так я ж не советую мерять вот таким секундомером



достаточно замерять wall time.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 00:24
Ну даа... Ясен хрен.



https://stack----flow.com/ques... ocesstimes
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 01:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
 
double getTime() {
    LARGE_INTEGER freq, val;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&val);
    return (double)val.QuadPart / (double)freq.QuadPart;
}
 
 
 
int main()
{
    double d0 = getTime();
 
    // function to measure
    
    double timeInMilliseconds = 1000 * (getTime() - d0);
    printf("%lf", timeInMilliseconds);
    getchar();
    return 0;
}
Добавлено через 12 минут
Вложение 1501135
Вместо генератора RND() пойдёт...
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
10.02.2025, 01:06
Цитата Сообщение от Наталья8 Посмотреть сообщение
Компьютер, вместе с этой задачей, паралельно выполняет кучу других.
Зачастую это не проблема (не сильно влияет на результат; или этого можно избежать "отключением лишних процессов"). Какой-нибудь GetTickCount() в билдере или аналогов (в других средах) обычно вполне достаточно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,589
10.02.2025, 01:10
gunslinger, ещё нужно брать в расчет точность (чувствительность, resolution) часов. Например, я когда-то проверял, на моем ноуте HPET, имеющий точность в 100 наносекунд, т. е. часики работают на 10 МГц.
А вот у обычного кварцевого резонатора, работающего на 32 768 Гц, точность где-то 31 μs, если быть точнее 30518 наносекунд. Так у меня было на старом ноуте.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 01:41

Вот это долго считает. Время разное.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 01:52
Вот этот вариант из моего загашника, вроде как бы получше считает.
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
int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std::chrono;
    while (1){
        high_resolution_clock::time_point t1 = high_resolution_clock::now();
 
//--------------------------            
        double df(100000000);
        while (--df) {
 
            if ((int)df % 2 == 0);
        }
//--------------------------
        
        high_resolution_clock::time_point t2 = high_resolution_clock::now();
 
        duration<double>time_span = duration_cast<duration<double>>(t2 - t1);
 
        std::cout << "It took me: " << time_span.count() << " seconds.";
        std::cout << std::endl;
    std::cout << " =========================== \n"; Sleep(500);
             }
    return 0;
}
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 01:56
Результаты тоже оставляют желать лучшего.
Ни какую функцию этим не намеряешь.

0
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
10.02.2025, 02:08
Цитата Сообщение от Наталья8 Посмотреть сообщение
Точность тоже оставляет желать лучшего.
Ни какую функцию этим не намеряешь.
А если сравнивать медиану или наименьшее выборок?
Ох, как же просто затриггерить плюсовиков на обсуждение быстродействия Когда замерял быстродействие через QElapsedTimer, он выдавал погрешность порядка десятка миллисекунд, но больше от винды я получить и не рассчитывал. Впрочем, я в этом деле профан и лучше посмотрю ваш спор с безопасного расстояния
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,247
10.02.2025, 02:21
Да какой спор ? спать пора.
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,296
10.02.2025, 06:25
Цитата Сообщение от Anvis Посмотреть сообщение
Но раз уж пошла такая пьянка, было бы интересно узнать, с какого момента оптимизатор начнет понимать, что функцию надо встраивать. Статьи в интернете вообще предлагают не использовать инлайн, ссылаясь на то, что современные компиляторы сами отлично понимают, когда функцию лучше встраивать, и вообще это не модно.
компилятор имеет возможность оценить, что будет, если тело функции встроить - будет ли это эффективнее или нет.

"inline" на этот процесс влияния не оказывает, это ключевое слово используется для других вещей - решение проблем с multiple definition для функций и глобальных объектов, определённых в заголовках.
Ну и для namespace немножко используется, вкидывает вложенный в охватывающий
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6317 / 3041 / 1054
Регистрация: 01.06.2021
Сообщений: 11,589
10.02.2025, 20:18
Цитата Сообщение от Алексей1153 Посмотреть сообщение
для функций и глобальных объектов, определённых в заголовках
а зачем их определять в заголовке? Да это дело вкуса, но только извращенцы так делают есть же файлы реализации. Никогда не понимал людей, которые создают тыщу cpp и один заголовок, который к тому же волшебный - непонятно по какой причине содержащий в себя определения глобальных переменных и функций...
Нужно просто не использовать этот паттерн

Новичкам нужно учить declare, don't define in headers. Глобальную переменную объявить в заголовке с extern, а инициализировать уже в файле реализации. Так же само, определять функции в файле реализации.

Но я не говорю, что inline использовать не нужно.
DrOffset когда-то приводил пример, где без inline не обойтись
Например у нас есть Си-библиотека (или просто библиотека с Си-интерфейсом).
Зачем делают библиотекам Си-интерфейс, я думаю, ни для кого не секрет: ABI Си стабильно и поддерживается большинством программных систем.
Но у Си-интерфейс есть недостатки, в частности необходимость вручную контролировать время жизни ресурсов.
Как можно получить преимущества С++, но при этом не потерять в переносимости? Допустим, я хочу написать библиотеку в VC++, но дать возможность ей пользоваться из любого компилятора С и С++ под Windows. Я делай ей Cи API, и делаю ей C++ API, которое полностью inline и инкапсулирует работу с Си API. Т.к. все функции в С++ API - inline, т.е. не экспортируются, то различие ABI при использовании его из разных компиляторов не играет роли: каждый компилятор собирает его так, как ему нужно, сводя все в итоге к сишным вызовам, которые уже переносимы. Хорошо написанная таким образом библиотека не выдает свою Си-сущность, пользователь не заглядывая в заголовочный файл даже и не знает, что на самом деле пользуется Си-интерфейсами. Добиться этого без inline api просто невозможно.
Хотя, тут у меня есть вопросы. Например, почему вместо этого не использовать паттерн PImpl, будет эффективнее...
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
10.02.2025, 22:40
Цитата Сообщение от Royal_X Посмотреть сообщение
Например, почему вместо этого не использовать паттерн PImpl, будет эффективнее...
Очевидно жеж, потому что классический pimpl (напр как в Qt) зависим от ABI, а неклассический - это те же самые сишные вызовы.

Royal_X, тока не говори, что я опять тебя преследую
0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,296
11.02.2025, 05:44
Цитата Сообщение от Royal_X Посмотреть сообщение
а зачем их определять в заголовке?
для удобства, очевидно же. И для оптимизатора в том числе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2025, 05:44

Прототип функции | Определение функции
Всем доброго времени суток. Начал изучение не так давно и возник первый вопрос. Читаю книгу &quot;Язык программирования С++, лекции и...

Прототип функции
Здравствуйте) Написать программу упорядочивания элементов массивов А(50), В(50), С(50) по возрастанию, используя прототип функции. ...

Прототип функции
Что такое протатип функции и зачем он нужен? Как его написать? какой пратотип у функции: void swap(int a, int b){ int c = a; a...

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

Прототип функции
Записать прототип функции, которая осуществляет перевод десятичного числа в двоичную систему. #include &lt;stdio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru