Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Встраиваемые функции 
:(
    Опции темы
Riddik
Дата 24.4.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



В теории сказано, что если предварить объявление функции ключевым словом inline, то программа будет выполняться чуточку быстрее, так как компилятор просто вставит код этой функции в то место программы, где она вызывается, а не будет тратит процессорное время для её вызова. Однако, встраиваемыми могут быть только простые и не большие ф-ии, а так же ф-ии, не содержащие в своём теле циклы.
Не могу понять, почему? Какая разница для компилятора, просто копировать тело ф-ии и вставить в место её вызова в основном коде? Хоть циклы, хоть нет.
И где кончается "простая" ф-ия и начинается "сложная", которая не будет inline?
PM MAIL   Вверх
J0ker
Дата 24.4.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(Riddik @  24.4.2009,  00:41 Найти цитируемый пост)
а так же ф-ии, не содержащие в своём теле циклы.

не циклы, а рекурсию


--------------------
user posted image
PM MAIL   Вверх
InvalidProperty
Дата 24.4.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 356
Регистрация: 31.10.2007
Где: Россия, Казань

Репутация: 2
Всего: 9



Цитата(Riddik @  24.4.2009,  00:41 Найти цитируемый пост)
Однако, встраиваемыми могут быть только простые и не большие ф-ии

конкретно для gcc есть директива, которая говорит компилятору, что функция должна быть inline по-любому. Для остальных компиляторов не скажу. Кстати, не понятно, как будет вести себя компилятор в случае этой директивы для функции с рекурсией.


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
mrbrooks
Дата 24.4.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(J0ker @  24.4.2009,  01:08 Найти цитируемый пост)
не циклы, а рекурсию 

Цитата

Проект стандарта перечисляет следущие причины, по которым функция со спецификатором inline  будет трактоваться как обычная функция:
   - встраиваемая функция слишком велика;
   - встраиваемая функция рекурсивна;
   - обращение к встраиваемой функции в программе размещено до ее определения;
   - встраиваемая функция вызывается более одного раза в выражении;
   - встраиваемая функция содержит цикл, переключатель или оператор перехода.

PM MAIL   Вверх
Cheloveck
Дата 24.4.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата

Кстати, не понятно, как будет вести себя компилятор в случае этой директивы для функции с рекурсией. 

Если в программе есть хоть один указатель на inline функцию, то будит сгенерирован код для этой функции, несмотря на то, что она inline, мало того, если в ней будит рекурсия, то компилятор проигнорирует inline и создаст обычную функцию. 

Что-то в этом духе написано у Майерса.


--------------------
user posted image
PM Jabber   Вверх
mes
Дата 24.4.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Cheloveck @  24.4.2009,  11:27 Найти цитируемый пост)

Если в программе есть хоть один указатель на inline функцию, то будит сгенерирован код для этой функции, несмотря на то, что она inline, мало того, если в ней будит рекурсия, то компилятор проигнорирует inline и создаст обычную функцию. 

Никто не запрещает компилятору/линкеру одновременно реализовывать обычную функцию и инлайнить  ее в нужных местах.


--------------------
PM MAIL WWW   Вверх
zim22
Дата 24.4.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Cheloveck @  24.4.2009,  12:27 Найти цитируемый пост)
мало того, если в ней будит рекурсия, то компилятор проигнорирует inline и создаст обычную функцию. 

Из книги "Программирование на С++" Дж.Коплиен. Книга 1992 года smile
Цитата

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


Это сообщение отредактировал(а) zim22 - 24.4.2009, 12:45


--------------------
PM MAIL   Вверх
Cheloveck
Дата 24.4.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата

Никто не запрещает компилятору/линкеру одновременно реализовывать обычную функцию и инлайнить  ее в нужных местах. 

Я не сказал, что она не будет встроена, я сказал, что будет сгенерирован эекземпляр.


zim22, знаешь сколько выходило спецификаций C++ с 1992 года? =) Не исключено, что сегодня компиляторы ведут себя иначе.


--------------------
user posted image
PM Jabber   Вверх
J0ker
Дата 24.4.2009, 20:58 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



mrbrooks
это теоретическое ограничение связано со сложностями построения синтаксического дерева
в большинстве компиляторов эта проблема решается на стадии препроцессора (вроде-бы)


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.