Форум программистов, компьютерный форум CyberForum.ru

Затраты на вызов функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.07.2012, 22:43     Затраты на вызов функций #1
Тратится ли время и вообще "средства" компьютера на вызов функций? И если да то почему бы не писать программы сплошным текстом(как бы трудно это не было бы).

То есть образно говоря что лучше 10000 строк кода без функций или 6000 - с функциями.

Заранее спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 22:43     Затраты на вызов функций
Посмотрите здесь:

Вызов функций C++
C++ Вызов функций
Вызов функций C++
Вызов функций из файлов. C++
Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.07.2012, 22:46     Затраты на вызов функций #2
inline
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2012, 22:57     Затраты на вызов функций #3
ну и для тех кто совсем сомневаеться
C++Performance.pdf
раздел 5.3
miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.07.2012, 23:03  [ТС]     Затраты на вызов функций #4
Про inline функции мало-мальски слышал. И как говорил преподователь таким образом могут быть объявлены только маленькие функции. А за мою недолгую практику увидел что такие функции редкость.

Попробую привести пример. В цикле 100 раз находится минимальный элемент массива: можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.07.2012, 23:04     Затраты на вызов функций #5
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
И как говорил преподователь таким образом могут быть объявлены только маленькие функции
Почему?
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
В цикле 100 раз находится минимальный элемент массива: можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
Ага. Так в чем вопрос-то?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
26.07.2012, 23:06     Затраты на вызов функций #6
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
А за мою недолгую практику увидел что такие функции редкость.
Значит, практика не только недолгая, но и некачественная.

Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
Эта функция вполне себе неплохо заинлайнится, так что можно иметь и удобство с наглядностью от первого варианта, и производительность от второго. Впрочем, если сам по себе массив большой, то даже без инлайна удельная доля затрат на вызов-возврат будет ничтожна.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.07.2012, 23:19     Затраты на вызов функций #7
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
Попробую привести пример. В цикле 100 раз находится минимальный элемент массива: можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
Если вы пишите драйвера или обсчет трехмерной графики, или какой-нибудь критический участок алгоритма - разворачивание цикла может быть допустимо
в ином случае это возврат к практикам 30-летней давности, от которых в современности ушли в угоду читаемости и поддерживаемости кода
miriganua
129 / 100 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.07.2012, 23:19  [ТС]     Затраты на вызов функций #8
Цитата Сообщение от soon Посмотреть сообщение
Сообщение от Игорь Миронюк
И как говорил преподователь таким образом могут быть объявлены только маленькие функции
Почему?
Я имел ввиду, что целесообразно инлайнить только маленькие функции.

Цитата Сообщение от soon Посмотреть сообщение
Сообщение от Игорь Миронюк
В цикле 100 раз находится минимальный элемент массива: можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
Ага. Так в чем вопрос-то?
Что лучше?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.07.2012, 23:20     Затраты на вызов функций #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
Я имел ввиду, что целесообразно инлайнить только маленькие функции.
это как правило действительно так
смысл в том, что инлайнить имеет смысл функции, время работы которых сопоставимо с затратами на их вызов
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
27.07.2012, 00:37     Затраты на вызов функций #10
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
В цикле 100 раз находится минимальный элемент массива
Несерьезно. За секунду можно найти минимальный элемент массива размером 10^7 элементов(на среднем домашнем компьютере).
Причем вместо этого цикла лучше использовать готовую функцию std::min_element, которая явно не будет медленнее варианта с циклом, однако может оказаться быстрее в 4(или еще больше) раза(на обычном домашнем компьютере). Потому как gcc, к примеру, предоставляет распараллеленную реализацию этой функции(и многих других).

Добавлено через 27 минут
Кстати, приведу пример.
Решал я как-то эту задачу.
В ней нужно пройтись поиском в глубину по 20 000 вершин. В этой задачке есть топ решений, в который я в итоге прорвался, сдав вариант, отработавший за 15 миллисекунд.
Собственно, поиск в глубину подразумевает под собой рекурсию, причем в этой задаче глубина рекурсии может достигать 20000 вызовов. Я захотел оптимизировать этот момент, и заменил рекурсивную функцию на цикл со стеком. Это, на самом деле, было непросто. В итоге я не заметил никакой разницы во времени между рекурсией и циклом. Замечу, что на проверяющей системе стоит не лучший компилятор(студия 4-летней давности), к тому же в режиме без оптимизаций, т.е. особых оптимизаций ждать от нее не стоит. А современные компиляторы неплохо умеют инлайнить даже рекурсию, и явно сделают это лучше, чем программист.
Catstail
Модератор
 Аватар для Catstail
21504 / 10257 / 1670
Регистрация: 12.02.2012
Сообщений: 17,143
27.07.2012, 09:33     Затраты на вызов функций #11
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
почему бы не писать программы сплошным текстом
Главная причина: процедуры обеспечивают более надежный код. При внесении изменений нужно подправить процедуру в одном месте. А если писать "сплошным текстом" - придется править в 10 местах. Или в ста. Или в тысяче.

А микросекундные затраты на занесение в стек и извлечение - это фигня, не играющая роли.
Denis_prophet
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 2
21.07.2015, 18:35     Затраты на вызов функций #12
Так никто и не ответил на поставленный вопрос...
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
21.07.2015, 18:48     Затраты на вызов функций #13
Сдвинуть указатель на вершину стека, записать код возврата, записать передаваемые аргументы, записать в РА адрес вызываемой функции, после работы записать в РА адрес места, в котором была вызвана функция, сдвинуть указатель на вершину стека обратно. Вроде ничего не забыл, но тем не менее - ответ да, на все приведённые операции необходимы вычислительные ресурсы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2015, 18:57     Затраты на вызов функций
Еще ссылки по теме:

Вызов функций C++
C++ Вызов функций внутри других функций
C++ Вызов функций

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.07.2015, 18:57     Затраты на вызов функций #14
Цитата Сообщение от Denis_prophet Посмотреть сообщение
Так никто и не ответил на поставленный вопрос...
Создай новую тему и задай вопрос. Это будет намного эффективнее чем поднимать тему трёхлетней давности.

Добавлено через 6 минут
Цитата Сообщение от miriganua Посмотреть сообщение
Тратится ли время и вообще "средства" компьютера на вызов функций?
А вообще ответ - да. Тратятся.
Yandex
Объявления
21.07.2015, 18:57     Затраты на вызов функций
Ответ Создать тему
Опции темы

Текущее время: 09:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru