11 / 11 / 1
Регистрация: 24.11.2015
Сообщений: 359
1

Inline функции

28.11.2015, 15:03. Показов 2455. Ответов 8
Метки нет (Все метки)

Здарова всем!

А может кто-нибудь объяснить товарищу внятно, для чего нужны inline-функции? Вроде говорят, что их объявлять нужно до первого вызова + работают они быстрее.

и чо? Что значит работают быстрее? Ну напишу обычную функцию место инлайн, ну подожду чуток. В чем проблема?
Что за такое заумное это понятие инлайн - функция?

Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2015, 15:03
Ответы с готовыми решениями:

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она...

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные,...

inline функции
Добрый вечер. Хотелось бы узнать, есть ли минусы у inline функций кроме увеличения размера файла?...

Inline функции.
Здравствуйте. Скажите пожалуйста, объявление функции как inline нужно делать как в прототипе так и...

8
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 495
28.11.2015, 15:11 2
Цитата Сообщение от Zigfrid Посмотреть сообщение
Что значит работают быстрее
Когда компилятор будет натыкаться на магическое слово "inline", он будет налету подставлять туда код из функции.

Вот это "налету" и получается быстрее.

Добавлено через 3 минуты
Цитата Сообщение от Zigfrid Посмотреть сообщение
Ну напишу обычную функцию место инлайн
Тоже думаю что писать самому эти Inline нет смысла. Но вот например методы класса в C++, как раз таки Inline.
0
Ушел с форума
Эксперт С++
16449 / 7413 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.11.2015, 15:20 3
Цитата Сообщение от Zigfrid Посмотреть сообщение
А может кто-нибудь объяснить товарищу внятно, для чего нужны inline-функции?
Для современных компиляторов что с inline, что без, функция будет
оптимизирована одинаково хорошо. Где-то будет вызов, а где-то функция
будет встроена по месту вызова. inline - это лишь рекомендация
компилятору, не более.

Другое использование inline - это когда, например, нужно держать реализацию
функции в заголовочном файле. Без inline будет ошибка типа "множественное
определение функции".
0
Модератор
Эксперт С++
12088 / 9763 / 5906
Регистрация: 18.12.2011
Сообщений: 26,213
28.11.2015, 15:44 4
Цитата Сообщение от Убежденный Посмотреть сообщение
Без inline будет ошибка типа "множественное
определение функции"
Это реализовано в новом стандарте языка?
У меня VS 2008:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
inline int convert(int n)
{
    return n;
}
inline int convert(int n)
{
    return n;
}
int main() 
{
    int n=convert(1);
    return 0;
}
1>d:\current\cpp\test\test.cpp(6) : error C2084: функция "int convert(int)" уже имеет текст реализации
1> d:\current\cpp\test\test.cpp(1): см. предыдущее определение 'convert'
1>d:\current\cpp\test\test.cpp(11) : error C3861: convert: идентификатор не найден
1>d:\current\cpp\test\test.cpp(11) : error C2440: инициализация: невозможно преобразовать 'int (__cdecl *)(int)' в 'int'
1> Не существует контекста, в котором такое преобразование возможно
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,969
28.11.2015, 15:57 5
Цитата Сообщение от zss Посмотреть сообщение
Это реализовано в новом стандарте языка?
Вообще имелась в виду ошибка линкера, в случае определения функции в разных единицах трансляции.
0
Модератор
Эксперт С++
12088 / 9763 / 5906
Регистрация: 18.12.2011
Сообщений: 26,213
28.11.2015, 16:04 6
Цитата Сообщение от DrOffset Посмотреть сообщение
в случае определения функции в разных единицах трансляции
В этом случае inline действует аналогично static - не позволяет использовать функцию в другой единице трансляции.
0
16082 / 8684 / 2120
Регистрация: 30.01.2014
Сообщений: 14,969
28.11.2015, 16:41 7
Цитата Сообщение от zss Посмотреть сообщение
В этом случае inline действует аналогично static - не позволяет использовать функцию в другой единице трансляции.
Абсолютно нет.
Для inline (как и для шаблонов) существуют поблажки в выполнении ODR. Т.е. допускается иметь несколько определений в разных единицах транляции при условии, что они полностью совпадают (иначе UB).
Однако у таких функций (и у шаблонных и у inline) внешнее связывание, как и у обычных.

Добавлено через 6 минут
Собственно во всех стандартах С++ есть сноска в параграфе 7.
The inline keyword has no effect on the linkage of a function
Соответственно, если мы не поместили inline функцию в анонимный namespace, и не определяли ее как static, то она будет иметь external linkage.
Особенно если в этом контексте вспомнить, что компилятор не обязан встраивать функцию (inline - это рекомендация), то все встает на свои места.

Добавлено через 18 минут
Можно даже больше сказать, т.к. предвижу непонимание этого вопроса и попытки поспорить.
В стандарте есть такая вот фраза:
7/4
An inline function with external linkage shall have the same address in all translation units.
Это значит, что если функция таки не будет встроена ни в одной из единиц трансляции и будет осуществляться честный вызов, то во всех единицах трансляции этот вызов будет одного и того же экземпляра функции, с одним и тем же адресом. Т.е. будет то, что происходит при вызове обычной функции с внешнем связыванием. Только контроль за присутствием только одного экземпляра определения функции в программе берет на себя компилятор. Именно поэтому так важно, чтобы все определения inline-функции во всех единицах трансляции совпадали, т.к. неизвестно заранее какую из них компилятор оставит в результате.
5
37 / 35 / 4
Регистрация: 10.01.2017
Сообщений: 1,348
21.12.2020, 19:19 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Это значит, что если функция таки не будет встроена ни в одной из единиц трансляции и будет осуществляться честный вызов, то во всех единицах трансляции этот вызов будет одного и того же экземпляра функции, с одним и тем же адресом. Т.е. будет то, что происходит при вызове обычной функции с внешнем связыванием. Только контроль за присутствием только одного экземпляра определения функции в программе берет на себя компилятор. Именно поэтому так важно, чтобы все определения inline-функции во всех единицах трансляции совпадали, т.к. неизвестно заранее какую из них компилятор оставит в результате.
А можно ли ка кто понять, что в итоге компилятор не встроил или встроил указанную inline функцию ?
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
21.12.2020, 19:26 9
Цитата Сообщение от Optimus11 Посмотреть сообщение
А можно ли ка кто понять, что в итоге компилятор не встроил или встроил указанную inline функцию ?
см волшебные ключики своего компилятора.

напрмер gcc:

-Winline
Warn if a function that is declared as inline cannot be inlined. Even with this option, the compiler does not warn about failures to inline functions declared in system headers.

The compiler uses a variety of heuristics to determine whether or not to inline a function. For example, the compiler takes into account the size of the function being inlined and the amount of inlining that has already been done in the current function. Therefore, seemingly insignificant changes in the source program can cause the warnings produced by -Winline to appear or disappear.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2020, 19:26
Помогаю со студенческими работами здесь

inline - функции
Стоит-ли добавлять префикс inline ко всем функциям, состоящим из 1-2 строк?

inline функции
Объясните, пожалуйста, почему со всеми inline программа не работает, а если их закомментировать -...

inline функции
Как рабоает функция inline, и какие у неё преимущества? Если она такая крутая как я понял, то зачем...

Inline функции
Друзья!Инлайн функции могу быть определены только внтури класса?Или могут быть определены вне...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru