Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
miriganua
131 / 102 / 4
Регистрация: 05.02.2012
Сообщений: 241
#1

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

26.07.2012, 22:43. Просмотров 1424. Ответов 13
Метки нет (Все метки)

Тратится ли время и вообще "средства" компьютера на вызов функций? И если да то почему бы не писать программы сплошным текстом(как бы трудно это не было бы).

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

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

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h - C++
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого числа и суммой всех остальных. ...

Передача значений функций в главную программу, вызов функций - C++
Здравствуйте! Скорее всего, неправильно передаю значения функциям и в главную программу. Помогите найти ошибку! В итоге выводит...

Вызов функций внутри других функций - C++
#include "stdafx.h" #include "stdio.h" #include <iostream> #include <fstream> #include <iomanip> using namespace std; ...

Вызов функций - C++
Для чего нужны stdcall и cdecl? и как они работают? Спасибо=)

Вызов функций - C++
Можно ли программно вызвать все функции записанные в файле?

Вызов функций - C++
В одномерном массиве, состоящем из п целых элементов, вычислить: 1) номер максимального элемента массива; 2) произведение элементов...

13
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
26.07.2012, 22:46 #2
inline
1
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2012, 22:57 #3
ну и для тех кто совсем сомневаеться
C++Performance.pdf
раздел 5.3
2
miriganua
131 / 102 / 4
Регистрация: 05.02.2012
Сообщений: 241
26.07.2012, 23:03  [ТС] #4
Про inline функции мало-мальски слышал. И как говорил преподователь таким образом могут быть объявлены только маленькие функции. А за мою недолгую практику увидел что такие функции редкость.

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

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

Цитата Сообщение от soon Посмотреть сообщение
Сообщение от Игорь Миронюк
В цикле 100 раз находится минимальный элемент массива: можно сделать функцию для нахождения минимального элемента и вызывать ее сто раз , а можно этот поиск осуществить в теле цикла.
Ага. Так в чем вопрос-то?
Что лучше?
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
26.07.2012, 23:20 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
Я имел ввиду, что целесообразно инлайнить только маленькие функции.
это как правило действительно так
смысл в том, что инлайнить имеет смысл функции, время работы которых сопоставимо с затратами на их вызов
1
diagon
Higher
1930 / 1196 / 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-летней давности), к тому же в режиме без оптимизаций, т.е. особых оптимизаций ждать от нее не стоит. А современные компиляторы неплохо умеют инлайнить даже рекурсию, и явно сделают это лучше, чем программист.
2
Catstail
Модератор
22838 / 11204 / 1812
Регистрация: 12.02.2012
Сообщений: 18,444
27.07.2012, 09:33 #11
Цитата Сообщение от Игорь Миронюк Посмотреть сообщение
почему бы не писать программы сплошным текстом
Главная причина: процедуры обеспечивают более надежный код. При внесении изменений нужно подправить процедуру в одном месте. А если писать "сплошным текстом" - придется править в 10 местах. Или в ста. Или в тысяче.

А микросекундные затраты на занесение в стек и извлечение - это фигня, не играющая роли.
1
Denis_prophet
0 / 0 / 0
Регистрация: 21.07.2015
Сообщений: 2
21.07.2015, 18:35 #12
Так никто и не ответил на поставленный вопрос...
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
21.07.2015, 18:48 #13
Сдвинуть указатель на вершину стека, записать код возврата, записать передаваемые аргументы, записать в РА адрес вызываемой функции, после работы записать в РА адрес места, в котором была вызвана функция, сдвинуть указатель на вершину стека обратно. Вроде ничего не забыл, но тем не менее - ответ да, на все приведённые операции необходимы вычислительные ресурсы.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
21.07.2015, 18:57 #14
Цитата Сообщение от Denis_prophet Посмотреть сообщение
Так никто и не ответил на поставленный вопрос...
Создай новую тему и задай вопрос. Это будет намного эффективнее чем поднимать тему трёхлетней давности.

Добавлено через 6 минут
Цитата Сообщение от miriganua Посмотреть сообщение
Тратится ли время и вообще "средства" компьютера на вызов функций?
А вообще ответ - да. Тратятся.
0
21.07.2015, 18:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2015, 18:57
Привет! Вот еще темы с ответами:

Вызов функций - C++
Можно ли преобразовать строку, вводимою с консоли в вызов функции? То есть к примеру у меня предопределено несколько функций. С консоли...

Вызов функций - C++
Всем привет! Слушайте, в проге которую я сейчас пишу несколько функций, и мне нужно по ходу работы программы вызывать другие функции. Из...

Определение и вызов функций - C++
Здравствуйте. Такая проблема с задачей....Нужно Определить функцию, проверяющую, является ли данное число простым, и функцию, вычисляющую...

Определение и вызов функций - C++
Всем привет. Записать алгоритм, проверяющий является ли заданное число простым как рекурсивную функцию. Вывести на экран все простые...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru