Для чего используются встроенные функции
Урок №101. Встроенные функции
Обновл. 13 Сен 2021 |
Использование функций имеет много преимуществ, в том числе:
Код, находящийся внутри функции, может быть повторно использован.
Гораздо проще изменить или обновить код в функции (что делается один раз), нежели искать и изменять все части кода в функции main() «на месте». Дублирование кода — хороший рецепт для ошибок и ухудшения производительности.
Упрощение чтения и понимания кода, так как вам не нужно знать реализацию функции, чтобы её использовать (предполагается наличие информативного названия функции и комментариев).
В функциях поддерживается проверка типов данных для гарантии того, что передаваемые аргументы соответствуют параметрам функции.
Однако, одним из главных недостатков использования функций является то, что при каждом их вызове происходит расход ресурсов, что влияет на производительность программы. Это связано с тем, что ЦП должен хранить адрес текущей команды (инструкции или стейтмента), которую он выполняет (чтобы знать, куда нужно будет вернуться позже), вместе с другими данными. Затем точка выполнения перемещается в другое место программы. Дальше все параметры функции должны быть созданы и им должны быть присвоены значения. И только потом, после выполнения функции, точка выполнения возвращается обратно. Код, написанный «на месте», выполняется значительно быстрее.
Для функций, которые являются большими и/или выполняют сложные задачи, расходы на вызов обычно незначительны по сравнению с количеством времени, которое отводится на выполнение кода этой функции. Однако для небольших, часто используемых функций, время, необходимое для выполнения вызова, часто превышает время, необходимое для фактического выполнения кода этой функции. А это, в свою очередь, может привести к существенному снижению производительности.
Язык C++ предлагает возможность совместить все преимущества функций вместе с высокой производительностью кода, написанного «на месте». Речь идет о встроенных функциях. Ключевое слово inline используется для запроса, чтобы компилятор рассматривал вашу функцию как встроенную. При компиляции вашего кода, все встроенные функции (англ. «inline functions») раскрываются «на месте», то есть вызов функции заменяется копией содержимого самой функции, и ресурсы, которые могли бы быть потрачены на вызов этой функции, сохраняются! Минусом является лишь увеличение компилируемого кода за счет того, что встроенная функция раскрывается в коде при каждом вызове (особенно если она длинная и/или её вызывают много раз). Рассмотрим следующий фрагмент кода:
Встраиваемые функции
Встраиваемые функции
В ызов функции, хоть в си он очень быстрый, отнимает некоторое время. В современном си есть возможность объявлять встраиваемые функции. При компиляции вызов функции будет заменён её телом.
Для объявления встраиваемой функции используется ключевое слово inline (или __inline, __forceinline в зависимости от компилятора)
Здесь, для тестирования, использованы атрибуты компилятора gcc, которые форсируют встраивание. Рассмотрим код, который компилируется при использовании inline
И без использования (видим вызов функции CALL в строке 10)
Inline функции имеют ряд недостатков. Во-первых, компилятор может отказать во встраивании функции, если это снижает скорость выполнения. Снижение может происходить в том числе и из-за того, что кеш инструкций будет переполняться. Вообще, inline следует скорее рассматривать как подсказку компилятору, а не руководство к действию.
Во-вторых, для встраиваемых систем, в которых разные функции могут располагаться в разных сегментах памяти, это недопустимо, так как вызов может произойти не в том сегменте, в котором ожидалось.
В-третьих, это даёт достаточно малый прирост производительности, но усложняет процесс сборки, оптимизации и увеличивает время компиляции. Во время внешнего связывания (external linkage) также могут возникнуть проблемы, если функция не была объявлена inline во всех компилируемых модулях. Поэтому часто встраиваемые функции объявляют также статическими.
Встроенные функции в C ++
Встроенная функция является одной из важных особенностей C ++. Итак, давайте сначала разберемся, почему используются встроенные функции и какова цель встроенных функций?
Когда программа выполняет инструкцию вызова функции, ЦПУ сохраняет адрес памяти инструкции, следующей за вызовом функции, копирует аргументы функции в стек и, наконец, передает управление указанной функции. Затем ЦПУ выполняет код функции, сохраняет возвращаемое значение функции в заранее определенной ячейке памяти / регистре и возвращает управление вызывающей функции. Это может стать издержкой, если время выполнения функции меньше, чем время переключения с вызывающей функции на вызываемую функцию (вызываемый). Для функций, которые являются большими и / или выполняют сложные задачи, накладные расходы на вызов функции обычно незначительны по сравнению с количеством времени, которое требуется функции для запуска. Однако для небольших, часто используемых функций время, необходимое для вызова функции, часто намного больше, чем время, необходимое для фактического выполнения кода функции. Эти издержки возникают для небольших функций, потому что время выполнения маленькой функции меньше, чем время переключения.
C ++ предоставляет встроенные функции для уменьшения накладных расходов на вызовы функций. Встроенная функция — это функция, которая раскрывается в строке при ее вызове. Когда вызывается встроенная функция, весь код встроенной функции вставляется или заменяется в точке вызова встроенной функции. Эта замена выполняется компилятором C ++ во время компиляции. Встроенная функция может повысить эффективность, если она мала.
Синтаксис для определения встроенной функции:
Помните, что встраивание — это только запрос к компилятору, а не команда. Компилятор может игнорировать запрос на встраивание. Компилятор может не выполнять встраивание в таких обстоятельствах, как:
1) Если функция содержит цикл. (пока, пока-пока)
2) Если функция содержит статические переменные.
3) Если функция рекурсивная.
4) Если тип возвращаемого значения функции отличается от void, и оператор возврата не существует в теле функции.
5) Если функция содержит оператор switch или goto.
Встроенные функции обеспечивают следующие преимущества:
1) Затраты на вызов функции не происходят.
2) Это также экономит накладные расходы на переменные push / pop в стеке при вызове функции.
3) Это также экономит накладные расходы на обратный вызов из функции.
4) Когда вы встраиваете функцию, вы можете разрешить компилятору выполнять контекстно-зависимую оптимизацию тела функции. Такая оптимизация невозможна для обычных вызовов функций. Другие оптимизации могут быть получены путем рассмотрения потоков вызывающего контекста и вызываемого контекста.
5) Встроенная функция может быть полезна (если она мала) для встроенных систем, поскольку встроенная функция может дать меньше кода, чем преамбула вызова функции и возврат.
Недостатки встроенной функции:
1) Добавленные переменные из встроенной функции потребляют дополнительные регистры, после встроенной функции, если число переменных, которые собираются использовать регистр, увеличивается, чем они могут создать издержки при использовании ресурсов переменных регистра. Это означает, что когда подставляется тело встроенной функции в точке вызова функции, также вставляется общее количество переменных, используемых функцией. Таким образом, число регистров, которые будут использоваться для переменных, также будет увеличено. Так что если после встраивания функции число номеров переменных резко возрастет, то это наверняка вызовет дополнительные затраты на использование регистра.
2) Если вы используете слишком много встроенных функций, размер двоичного исполняемого файла будет большим из-за дублирования одного и того же кода.
3) Слишком большое встраивание может также снизить частоту обращений к кешу инструкций, тем самым уменьшая скорость выборки инструкций от скорости кэш-памяти до основной памяти.
5) Встроенные функции могут быть бесполезны для многих встроенных систем. Потому что во встроенных системах размер кода важнее скорости.
6) Встроенные функции могут вызывать сбои, так как встраивание может увеличить размер двоичного исполняемого файла. Перегрузка памяти приводит к снижению производительности компьютера.
Следующая программа демонстрирует использование встроенной функции.
Подставляемые (встраиваемые) функции. Перегрузка функций
Цель лекции: изучить подставляемые (встраиваемые) функции и перегрузки функций, научиться разрабатывать программы с использованием перегрузки функций на языке C++.
Подставляемые функции
При неоднократных вызовах каждый раз программа будет отрабатывать один и тот же набор команд, не создавая копий для каждого вызова в отдельности.
Каждый переход к области памяти, содержащей операторы функции, замедляет выполнение программы. Если функция занимает небольшой объем, то можно получить выигрыш во времени при многократных вызовах, дав компилятору команду встроить код функции непосредственно в программу по месту вызова. Такие функции называется подставляемыми. В этом случае, говоря об эффективности, прежде всего, подразумевается скорость выполнения программы.
Подставляемые или встраиваемые (inline) функции – это функции, код которых вставляется компилятором непосредственно на место вызова, вместо передачи управления единственному экземпляру функции.
Если функция является подставляемой, компилятор не создает данную функцию в памяти, а копирует ее строки непосредственно в код программы по месту вызова. Это равносильно вписыванию в программе соответствующих блоков вместо вызовов функций. Таким образом, спецификатор inline определяет для функции так называемое внутреннее связывание, которое заключается в том, что компилятор вместо вызова функции подставляет команды ее кода. Подставляемые функции используют, если тело функции состоит из нескольких операторов.
Однако следует обратить внимание, что использование подставляемых функций не всегда приводит к положительному эффекту. Если такая функция вызывается в программном коде несколько раз, то во время компиляции в программу будет вставлено столько же копий этой функции, сколько ее вызовов. Произойдет значительное увеличение размера программного кода, в результате чего ожидаемого повышения эффективности выполнения программы по времени может и не произойти.
Перечислим причины, по которым функция со спецификатором inline будет трактоваться как обычная не подставляемая функция :
Еще одной из особенностей подставляемых функций является невозможность их изменения без перекомпиляции всех частей программы, в которых эти функции вызываются.
Перегрузка функции
Перегрузка функций – это создание нескольких функций с одним именем, но с разными параметрами. Под разными параметрами понимают, что должно быть разным количество аргументов функции и/или их тип. То есть перегрузка функций позволяет определять несколько функций с одним и тем же именем и типом возвращаемого значения.
Под полиморфизмом функции понимают существование в программе нескольких перегруженных версий функции, имеющих разные значения. Изменяя количество или тип параметров, можно присвоить двум или нескольким функциям одно и тоже имя. При этом никакой путаницы не будет, поскольку нужная функция определяется по совпадению используемых параметров. Это позволяет создавать функцию, которая сможет работать с целочисленными, вещественными значениями или значениями других типов без необходимости создавать отдельные имена для каждой функции.
Использование перегрузки функции
При использовании перегруженных функций часто допускается ряд ошибок. Например, если функции отличаются только типом возвращаемого значения, но не типами аргументов, такие функции не могут иметь одинаковое имя. Также недопустим следующий вариант перегрузки :
Встроенные функции
Урок 26. Информатика 9 класс ФГОС
В данный момент вы не можете посмотреть или раздать видеоурок ученикам
Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет, приобрев в каталоге.
Получите невероятные возможности
Конспект урока «Встроенные функции»
· Что такое встроенные функции?
· Для чего нужны встроенные функции?
· Как работать со встроенными функциями?
Основные задачи электронных таблиц – это вычислять и анализировать данные, а также пересчитывать значения при изменении данных. Их основная цель – облегчение работы.
Все просто и понятно, если, например, нужно найти сумму трех чисел, записанных в ячейки электронной таблицы. А что делать, если нужно суммировать 1000 чисел? Вручную писать формулу? В таких случаях без встроенных функций не обойтись.
Встроенные функции – это функции, которые уже содержатся в табличном процессоре и выполняют различные вычисления автоматически при их вызове из библиотеки функций.
Каждая функция имеет свое собственное имя, которое необходимо для ее вызова. Имя функции – это не что иное, как сокращение от названия функции. Например, функция «сумма» в табличном процессоре называется СУММ.
На вкладке Формулы в разделе библиотека функций, в виде кнопки «автосумма» со значком выпадающего списка находятся функции, которые пользователи используют чаще всего, например, найти сумму, среднее арифметическое, максимальное и минимальное значение.
Давайте попробуем вызвать функцию при введении формулы. Например, нужно вычислить значение выражения .
Рассмотрим несколько способов:
1 способ. Вызвать функцию можно просто набрав ее имя с помощью клавиатуры.
Итак, вводим «равно», теперь набираем на клавиатуре слово «КОРЕНЬ», теперь открываем скобку, в скобках можно ввести число с клавиатуры, можно указать ячейку или диапазон ячеек, теперь закроем скобку.
Данный способ неудобен тем, что при создании формул могут допускаться опечатки и синтаксические ошибки. Ссылки также лучше не вводить вручную, а указывать мышью ячейку или диапазон.
2 способ. Выбрать необходимую функцию из раскрывающегося списка.
Обратите внимание, вводим равно, теперь вводим букву «К», в раскрывшемся списке находим и выбираем необходимую нам функцию «Корень».
Мышкой указываем ячейку с числом, корень которого нужно вычислить.
3 способ. С помощью диалогового окна «Мастер функций».
Избежать ошибок при вводе имени функции и адресов ячеек позволяет использование Мастера функций.
Вызвать Мастера функций можно:
· Выбираем вкладку «Формулы», в разделе «Библиотека функций» нажимаем «Вставить функцию».
· Нажать кнопку «Вставить функцию» в строке формул.
· На вкладке «Формулы», в разделе «Библиотека функций» нажимаем «Автосумма». В выпадающем списке выберем пункт «Другие функции».
Обратите внимание! В ячейке автоматически появляется знак «равно».
Работа с мастером функций включает два шага.
1 шаг: в окошке «Поиск функции» пишем название нужной нам функции, в нашем случае корень, и нажимаем кнопку «Найти». В окошке «Выберите функцию» выделяем необходимую функцию и нажимаем «ОК».
2 шаг: в появившемся окне «Аргументы функции» в окошко «число» вводим нужное нам число, либо выбираем ячейку или диапазон ячеек. Нажимаем ОК.
В табличном процессоре очень много стандартных функций. Поэтому их сгруппировали по категориям. Это математические, статистические, логические, текстовые, финансовые и другие. Список всех категорий можно посмотреть в окошке «Категория» Мастера функций.
Таким образом, использование функции делает формулу более компактной и понятной. В большинстве случаев использование функций в формулах позволяет не только упростить саму формулу, но и выполнять такие вычисления, которые осуществить по-другому, без функций, просто невозможно.
Решение задачи с использованием функций.
Нам дана таблица успеваемости учащихся 9 класса. Нужно вычислить средний балл каждого ученика, а также средний, минимальный и максимальный баллы по отдельным предметам.
Откроем файл «Успеваемость», находящийся в вашей рабочей папке.
В ячейку I4 введем формулу для вычисления среднего балла первого ученика. Для этого:
· В выпадающем списке кнопки «Автосумма» выберите функцию «среднее»;
· При необходимости отредактируйте диапазон ячеек, для которых вычисляется среднее значение.
Отредактировать диапазон ячеек можно тремя способами:
· исправить имя ссылки в строке формул;
· непосредственно в ячейке;
· Перетащить маркер заполнения в нужное вам место.
Нажмите клавишу «Enter».
Для вычисления средних баллов остальных учеников скопируем формулу из ячейки I4 в диапазон I5:I9. То есть, перетащим маркер заполнения в нужное нам место.
Теперь в ячейку В10 введем формулу для вычисления среднего балла по русскому языку. Сделаем это следующим образом:
· Выделим ячейку В10;
· На вкладке Формулы в разделе Библиотека функций нажимаем «Вставить функцию»;
· В окошко «Поиск функции» напишем среднее значение и нажимаем кнопку «найти».
· В окошке «Выберите функцию» выделим СРЗНАЧ и нажимаем ОК.
· В появившемся окне диалога укажем диапазон ячеек, для которых вычисляем среднее арифметическое с помощью выделения этого диапазона мышью. Если диалоговое окно загораживает часть таблицы, его можно отодвинуть в сторону;
Скопируем формулу из ячейки В10 в диапазон С10:Н10.
Установим для ячеек I4:I9 и В10:Н10 числовой формат с одним десятичным знаком. Для этого:
· Выделим нужные нам ячейки;
· Нажимаем на выделенной части правой кнопкой мыши;
· В раскрывшемся меню выберем «Формат ячеек»;
· Теперь в окошке числовые форматы выбираем «Числовой»;
· Слева, в окошке «Число» десятичных знаков выбираем один.
Аналогично вычислим минимальные и максимальные баллы по предметам.
Обратите внимание! Компьютер предлагает захватить лишние данные. Мы должны взять именно нужный диапазон ячеек, а не полагаться во всем на компьютер.
Сохраним таблицу в свою рабочую папку.
Заметьте, мы не пользовались калькулятором, не делали никаких вычислений в уме и только с помощью табличного процессора и встроенных функций сделали необходимые вычисления.
· Встроенные функции – это функции, которые уже содержатся в табличном процессоре и выполняют различные вычисления автоматически при их вызове из библиотеки функций.
· В табличном процессоре очень много стандартных функций. Поэтому их сгруппировали по категориям. Это математические, статистические, логические, текстовые, финансовые и другие.
· Список всех категорий можно посмотреть в окошке «Категория» Мастера функций.
· Использование функции делает формулу более компактной и понятной. В большинстве случаев использование функций в формулах позволяет не только упростить саму формулу, но и выполнять такие вычисления, которые осуществить по-другому, без функций, просто невозможно.