Аватар для Everest Alpine
2 / 2 / 0
Регистрация: 10.01.2025
Сообщений: 41

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

07.02.2025, 07:37. Показов 4204. Ответов 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
13211 / 6844 / 1824
Регистрация: 18.10.2014
Сообщений: 17,316
09.02.2025, 11:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Функция и прототип функции - настолько простые и интуитивно понятные сущности, что для того что бы их понять - достаточно один раз прочитать в учебнике.
... понимая при этом, что в С++ "прототип функции" - это слэнговое понятие. Термин "прототип" пришел в С++ из языка С, где он имел существенное формальное значение. В С++ же формально нет "прототипов" вообще, однако мы иногда неформально используем этот термин для обозначения чистых (неопределяющих) объявлений функции.

А с выходом С23 и в языке С термин "прототип" потерял свою ценность. То есть сегодня фактически у него осталось только неформальное слэнговое значение и в С++, и в С.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
09.02.2025, 22:54
Цитата Сообщение от Anvis Посмотреть сообщение
было бы интересно узнать, с какого момента оптимизатор начнет понимать, что функцию надо встраивать
это же зависит от оптимизатора компилятора, уровня оптимизации, тут так сразу не скажешь
Цитата Сообщение от Anvis Посмотреть сообщение
И после его инлайна программа стала работать заметно быстрее.
Ну вообще, на глаз не меряют скорость. Ты время засекал? Никто не мешает смотреть ассемблерный код, полученный конкретным компилятором, который ты используешь. Потому что разные компиляторы по-разному оптимизируют.

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



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



https://stack----flow.com/ques... ocesstimes
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,276
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
10.02.2025, 01:10
gunslinger, ещё нужно брать в расчет точность (чувствительность, resolution) часов. Например, я когда-то проверял, на моем ноуте HPET, имеющий точность в 100 наносекунд, т. е. часики работают на 10 МГц.
А вот у обычного кварцевого резонатора, работающего на 32 768 Гц, точность где-то 31 μs, если быть точнее 30518 наносекунд. Так у меня было на старом ноуте.
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,276
10.02.2025, 01:41

Вот это долго считает. Время разное.
0
 Аватар для Наталья8
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,276
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
624 / 382 / 67
Регистрация: 09.03.2016
Сообщений: 4,276
10.02.2025, 01:56
Результаты тоже оставляют желать лучшего.
Ни какую функцию этим не намеряешь.

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

"inline" на этот процесс влияния не оказывает, это ключевое слово используется для других вещей - решение проблем с multiple definition для функций и глобальных объектов, определённых в заголовках.
Ну и для namespace немножко используется, вкидывает вложенный в охватывающий
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,321
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru