Les bases de la programmation en C ++ pour les débutants

Fonctions intégrées (inline-fonctions)




встроенные функции с++, инлайн функции, inline функции, Programmation pour les débutantsInline функции весьма занятный рудимент, доставшийся современному миру из уже далеких бандитских 90-х. Когда процветал ассемблер, Си компилировал очень компактные и маленькие программы, когда процессоры были слабенькими (по сравнению с тем, что сейчас в мобилки ставят к примеру) и время выполнения кода ценилось на вес золота. Этот тип функций вообще-то использовался не только в Си, и в то лихое время оправдывал себя.

Je pense que, не для кого не секрет, что древние компьютеры требовали при написании ПО для тяжелых вычислений достаточно таки серьезного подхода с позиции программиста. Выкручиваться и экономить приходилось на всём, иначе время работы программы увеличивалось в разы. Это сейчас мы гоняем гигабайтные игрушки не особо жалуясь на скорость работы. В то время это было чрезвычайно критично, и одним из способов сократить время работы, как раз являлись inline (intégré) fonctions. Сейчас я попробую более менее доступно рассказать почему.

si, что из себя представляет обычная fonction? Возьмем например простой примервычисление факториала.

Достаточно простые вычисления факториала (5!) dans pour la boucle, и возврат результата из функции. С++ расценивает эту функцию как некий блок операций, сгруппированный в отдельный блок. Блок этот после компиляции помещается в ячейки памяти единожды в коде, и тело функции (цикл в данном случае) нигде больше в скомпилированной программе не повторяется. Все красивополучается некий участок памяти, принадлежавший программе, на который процессор при необходимости перескакивает с того места, где находит вызов.

В данном операторе сия функция задействована, процессор просто выполнит команду ассемблера CALL, в которой будет передан адрес функции. à savoir. вызов функции обойдется в один оператор (если грубо говорить). ainsi, в памяти (точнее говоря в стеке программы) занимается место для параметров функции, если они есть, и обязательно для адреса, откуда процессор прыгнул на функцию.

Inline функция избавляет процессор прыгать в ячейку, по адресу которой начинается эта функция. Сам смысл inline il est, чтобы вместо вызова функции подставить ее тело (код функции) в место, где она вызывается.

Если описать наш факториал так:

То вместо

мы получим разворот функции в набор операторов:

как будто бы сами в коде написали в этом месте.

Соответственно код типа:

превратится в

Если мерить философскиколичество кода с inline функцией увеличилось. Вместо одной строки вызова функции ее тело, подставленное вместо вызова , дало целых 6 temps. Так же будет и в скомпилированной программеколичество операторов возрастет многократнона столько, сколько операторов в теле функции и сколько раз ее вписали в программу.

à savoir. различие между inline функцией и обычной функциейдублирование кода тела функции везде, где она оказывается задействована. В обычной функции, её тело находится в единственном экземпляре в одном и том же месте внутри программы.

Где здесь выгода спросите вы? Экономится время процессора на прыжки с места вызова в тело функции. Если функция огромная и используется в нескольких местах, la inline получается не совсем выгодно. cependant, если функция (тело её) маленькое, с минимальным количеством операторов, решающих задачу, в старину было удобнее отказаться от прыжка и просто подставить их в нужное место, как будто сам программист там их описал.

Как бы там ни было, в бытовых условиях да еще и на современных компьютерах, programmes, использующие inline подстановку тела функции вместо вызова, не дают особых преимуществ. Поэтому использовать этот вид функции приходится достаточно редко. IMHO, ему место в музее славы. bien que, чтоб быть до конца честным, такой подход дает свои плоды тем, кто программирует контроллеры, процессоры и прочие железяки. Но там свои особенности и свой подход, и в это углубляться сейчас не стоит. à utiliser встроенную функцию (inline fonction) ou non, – решать самому программисту. От себя могу добавить только одноне стоит делать это там, где этого не требуется по заданию.




Bulletin de nouvelles leçons sur la programmation:

Fonctions intégrées (inline-fonctions)
Noter cet article

14 réflexions sur "Fonctions intégrées (inline-fonctions)

  1. > Поэтому использовать этот вид функции приходится достаточно редко.

    Использовать inline функции явно приходится использовать, peut-être, и не так часто. Но они массово используются неявно при определении классов и создании объектов:
    любая функция-метод, определение котрой находится внутри определения её класса, неявно получает квалификатор inline.

    На примере класса, определяющего 2D-точку (на плоскости):

    И альтернативное 2-е определение, очень похожее:

    В 1-м варианте расстояние между 2-мя точками будет везде вычисляться inline, а во второмвызовом функции-метода.

    1. Конечно код в комментариях отображаетсяэто ужас … mais, надеюсь, будет понятно.

    2. Это уже забота компилятора. Имеется ввиду самому программисту редко приходится в бытовых условиях использовать этот вид функций.

      1. aucun. Это как раз тот случай, когда компилятору запрещено вмешиваться в реализацию метода: если метод описан внутри классаinline, а если внутри метод только объявляе, а реализация либо вне объявления класса или в отдельном файле (что чаще) – функцимональный вызов.
        Это как-раз случай, когда реализация находится полностью под контролем автора, а автор должен знать чем его определения обернутся.

      2. Принцип инлайнов не меняется в зависимости от того, в ООП его применяют или в функционалке )
        К чему такие усложнения теории? Я не против уточнений, но тогда нужна еще одна статья, описывающая разницу между тем и этим случаями. Нет никакой надобности мешать всю теорию в кучуполучится тот же самый MSDN.

  2. ещё одноймелочьюявляется то, что квалификатор inline является рекомендательным: компилятор использует его только если это возможно, если он считает, что это недопустимо, он использует функциональный вызов без всякого на то укедомленя (даже предупреждением).

    exemple – определите функцию факториала так:

    Здесь inline не сыграет никакой роли.

    1. Ну то же самое. В современном Си компилятор сам решает. В Си для 8086 ou 80286 не все компиляторы так оптимизировали.

  3. Ещё однамелочь”: функции с квалификатором inline замечательно работают, но до тех пор, пока определение функции и вызов находятся в одном файле кода. При росте проекта, стоит разделить код на несколько файлов (раздельная компиляия с последующим связыванием объектных файлов), и это создаст огромные проблемы с поиском ошибки: inline функци не пригодны для внешнего связывания.

    inlineэто определитель макроопределения, и они непригодны для внешнего связывания (линкования).

  4. > Этот тип функций вообще-то использовался не только в Си, и в то лихое время оправдывал себя.

    В стандарте языка C вообще нет ключевого слова inline, там подобные вещи реализуются через параметризированные макросы #define.
    В некоторых поздних компиляторах C inline включено, но только для пддержания совместимсоти с C++.
    Поэтому в принципе неверно говорить, что inline заимствовано из C, il – чисто C++ приобретение.
    Поэтому я бы вот тозалихватскоеначало выбросил.

    1. А я не намекал на стандарт. Я намекал на ЯВУ. В Паскале тоже такие функции существовали. Да и в бейсике кажется было что-то подобное в поздних его видах.

      1. > Этот тип функций вообще-то использовался не только в Си

        В языке C не было ключевого слова inline от момента, когда его в 1969г. начал формулировать Денис Ритчи, и почти до 2000-х годов.
        Всё это время если слов inline появилось программе C, оно бы вызвало синтаксическую ошибку.

  5. К вопросу совместимости C и C++в отношении inline:

    Если компилировать код как C, но с ключом -std=c89 (à savoir. стандарт ANSI 1989г.), то на inline просто будет синтаксическая ошибка. И на всех более ранних стандартах языка C.
    Использование inline в C допустит только компилятор с опцией -std=c99, à savoir. такое ключевое слово допускается стандартом C только после 1999г.

  6. en fait, статья про inline функции, в отличие от большинства статей сайтанеудачная. Je pense que, что её следовало бы слегка скорректировать, добавив и исправив с учётом указанных позиций.

    1. Je, когда ее писал, не желал вдаваться в особые подробности, чтоб не загораживать ими саму суть. Не зря в интернете есть правилоМногабукаф”, которое зачастую раздувает контент в салат Ой-Ливьйо.

Laisser un commentaire

Votre adresse email ne sera pas publiée. les champs requis sont indiqués *