Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 377
#1

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? - C++

03.05.2014, 15:50. Просмотров 809. Ответов 7
Метки нет (Все метки)

Здравствуйте.

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

Как устанавливается данный критерий ? Исходя из кол-ва строк ? Или из функционала функции?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2014, 15:50     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Посмотрите здесь:
C++ inline функции vs инструкции inline функций
C++ Какие требование должны быть к inline-функции, кроме её размера?
C++ inline функция
C++ Inline функция в Debug режиме
C++ Как адаптировать функцию под inline
virtual inline функция-член каласса C++
C++ Inline функции.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
03.05.2014, 15:59     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #2
Думаю,что на современных машинах даже большое количество inline функций будут работать не быстрее,чем невстраиваемые.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
03.05.2014, 16:10     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #3
Цитата Сообщение от Игорюня Посмотреть сообщение
даже большое количество inline функций будут работать не быстрее,чем невстраиваемые
А вот это заблуждение, ответственно тебе заявляю. Очень даже быстрее работать будут (если вызывается эта функция очень часто, конечно).
pEntity, если ты ошибся и функцию сделать inline нельзя, ее таковой компилятор и не сделает - ты просто "хочешь", чтобы функция была inline - компилятор учтет твое мнение, и сделает как захочет) Вообще говоря, такими функциями всякие простые гетеры делать самое оно, ну или нечто типа индексации и т.п.
gng
632 / 478 / 130
Регистрация: 08.09.2013
Сообщений: 1,264
03.05.2014, 17:30     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #4
Цитата Сообщение от pEntity Посмотреть сообщение
Как устанавливается данный критерий ? Исходя из кол-ва строк ? Или из функционала функции?
Чаще пологаются на эвристический анализ современных компиляторов.
Например gcc с опцией оптмизации -O3 предполагает, что ВСЕ функции описаны как online, и после этого решает, какие из них все же стоит вызывать обычным образом. Более того, оптимизирующие компиляторы часто вместо вызова стандартных функций из libc вставляют свой код.
Тем не менее помечать некоторые функции online - хороший стиль, а иногда и нужная подсказка компилятору. На практике - это, обычно, функции из нескольких (1-5) строк, не имеющие циклов.

Добавлено через 3 минуты
PS. Правка опечаток: s/online/inline/

Добавлено через 18 минут
PPS. Ещё один момент. Если реализация функции написана в заголовочном файле вне описания класса, то она должна быть описана inline во избежание ошибок линкера.
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 26
03.05.2014, 19:18     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #5
Цитата Сообщение от pEntity Посмотреть сообщение
Знаю теорию, но не понимаю, на сколько должна быть маленькая функция, чтоб она подошла под inline ?
Это очень сильно зависит от компилятора, настроек компилятора и целевого процессора, под который работает компилятор

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

C
int foo (int x, int y)
{
  if (x < 0 && y < 0)
    return x / y;
  else if (x < 0 && y >= 0)
    return x * y;
  else if (x >=0 && y < 0)
    return x + y;
  else
    return x - y
}
 
int bar (void)
{
  return foo (10, 20);
}
Без inline при исполнении функции bar будет выполнено много операций. С inline'ом функция превратится просто в "return -10;"

После того, как компилятор выполнит inline, появляется возможность вычистить мёртвый код, свернуть константные выражения (именно под эти две штуки заточено очень много реализаций inline-Методов в контейнерах Си++). После inline у компилятора появится масса возможностей по перестановке операций с целью как можно плотнее заполнить конвейеры современных суперскалярных процессоров, которые умеют выполнять несколько операций одновременно, и будут делать это очень эффективно, если компилятор обеспечит правильную последовательность операций

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

Добавлено через 1 минуту
Ну и полезная ссылка http://www.cyberforum.ru/blogs/18334/blog93.html
В Си++ на ключевое слово inline навешивается дополнительная функциональность, помимо простого указания компилятору, что надо бы про'inline'ить
gng
632 / 478 / 130
Регистрация: 08.09.2013
Сообщений: 1,264
03.05.2014, 21:18     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #6
Evg,
Дописал к Вашему коду
C
1
2
3
int main() {
  return bar();
}
gcc -O3 скомпилировал в return -10 без наличия inline.
С отключенной оптимизацией (-O0) выполнение пошло по полному кругу даже при наличии inline.
А вот в более распространенном случае (-O2) ключевое слово повлияло КАРДИНАЛЬНО.
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 26
03.05.2014, 22:01     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #7
Цитата Сообщение от gng Посмотреть сообщение
gcc -O3 скомпилировал в return -10 без наличия inline
Под "inline" я подразумевал возможность компилятора выполнять inline-подстановку, а не наличие ключевого слова inline. Подай опцию -fno-inline (чтобы отключить возможность inline) - код будет плохой. Т.е. в посте #2 написано далеко не истина
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2014, 01:28     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Еще ссылки по теме:
inline функции C++
C++ inline - функции
Inline функции C++
C++ inline функции
C++ Inline функции

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

Или воспользуйтесь поиском по форуму:
gng
632 / 478 / 130
Регистрация: 08.09.2013
Сообщений: 1,264
04.05.2014, 01:28     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline? #8
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. в посте #2 написано далеко не истина
Не берусь защищать пост #2, поскольку его автор делает акцент на современные машины, а не на оптимизацию. Я хотел сказать немного о другом. Оптимизация компилятором сглаживает некоторые приемы программиста, применяемые с целью оптимизации. Например, я в порядке вещей пишу
C
1
2
3
4
5
double a= 5555; 
double b= 22222;
double c= 0;
for (int i= 0; i < 1000000; i++)
  c+= a*b;
просто, чтобы не вводить новую переменную, хотя ешё лет 10 назад это считалось, по меньшей мере, дурным стилем.
Yandex
Объявления
04.05.2014, 01:28     Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Ответ Создать тему
Опции темы

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