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

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

Войти
Регистрация
Восстановить пароль
 
 
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

Зачем нужен inline - C++

06.10.2009, 23:36. Просмотров 23902. Ответов 31

Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и не понял зачем она нужна. Желательно пример с комментарием. Зараннее благодраю за скорый ответ.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
06.10.2009, 23:42     Зачем нужен inline #2
завидев такую конструкцию, компилятор может встроить тело функции немостредственно в точку вызова. таким образом код распухает, но за счёт отказа от вызова функции может работать быстрее
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.10.2009, 23:42     Зачем нужен inline #3
Компилятор просто заменяет вызов функции, кодом самой функции. Это чаще всего применяется для маленьких по размеру функций. Компилятор, все равно, сам решит инлайнить функцию или нет. А зачем пример? Самое обычное объявление функции, просто с ключевым словом inline и все.
XuTPbIu_MuHTAu
Эксперт С++
2222 / 737 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
06.10.2009, 23:45     Зачем нужен inline #4
Syltan, инлайн функция перемалывается компилятором так,что фактического вызова не происходит,ее код "копируется" туда,откуда она вызвана. Для часто вызываемых,но очень коротких функций, inline выгодно указывать,для остальных не принципиально. Надо сказать,что современные компиляторы плевать хотели на указание директивы инлайн, т.е посчитав,что это не выгодно,они проигнорируют желание программера. Выглядит это примерно так : "Слушай,компилятор,вот эту бы функцию хорошо бы встраивать.."... "Молчать,человечишко,мне виднее" - отвечает ему компилятор. Теоретически, после этого программер может обидеться и сказать "__forceinline",после чего железке останется только повиноваться(если это возможно). Это поведение актуально для Visual Studio. Старенький борланд си вряд ли решится спорить,но тут уж я не могу утверждать. Подробнее про поведение компилятора нужно читать в его справке. Для вижуал студии читать тут
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
06.10.2009, 23:47     Зачем нужен inline #5
Обрати внимание только, что inline - это не приказ, а нижайшая просьба к компилятору: "Милостивый государь, будьте так любезны, попытайтесь заинлайнить эту функцию, пожалуйста." - каковую просьбу компилятор может выполнить, а может и проигнорировать. Поэтому рассчитывать на то, что функция будет обязательно заинлайнена, нельзя. Как карта ляжет.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 00:16     Зачем нужен inline #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
На самом деле смысл модификатора не только в том, что это типа просьба проинлайнить функцию. Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом. Если по простому, то функцию с модификатором inline можно помещать в файл *.h. Даже если функция не будет проинлайнена, то множественное её определение в разных модулях компиляции не вызовет слома при линковке.

Причём в стандартном Си этого модификатора нет, только в Си++, Си99, GNU C. Причём во всех языках работа с модификаторм идёт по разному. Когда-то с этим вопросом пришлось поразбираться, если завтра не забуду - на работе записано должно быть
XuTPbIu_MuHTAu
Эксперт С++
2222 / 737 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
07.10.2009, 00:38     Зачем нужен inline #7
Цитата Сообщение от Evg Посмотреть сообщение
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Не знал,не поверил,проверил - действительно так. Спасибо за инфу
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 13:16  [ТС]     Зачем нужен inline #8
C++
1
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Можно вот это место расшифровать,чтоб понятно было.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 13:44     Зачем нужен inline #9
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Можно вот это место расшифровать,чтоб понятно было.
Далее я написал "Если по простому..." - это и есть расшифровка. Те, кто разбираются, те поймут, что значит weak. Те, кто не разбираются - начиная со слов "Если по простому" следует некое грубое пояснение на пальцах
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 13:46  [ТС]     Зачем нужен inline #10
Хорошо,скажите что такое weak и всё?
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 14:08     Зачем нужен inline #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Syltan Посмотреть сообщение
Хорошо,скажите что такое weak и всё?
Атрибут символьной ссылки в бинарном файле. Забей, всё равно не поймёшь. Для тебя важно лишь то, что функция с модификатором inline может быть определена несколько раз и от этого не будет ошибок на линковке. Грубо говоря

C++
1
2
3
/* Файл t1.cc */
inline void func (void) { }
int main (void) { return 0; }
C++
1
2
/* Файл t2.cc */
inline void func (void) { }
Далее компиляешь эти два файла вместе и у тебя успешно всё проходит. Теперь убери модификатор inline и у тебя призойдёт слом на линковке. На пальцах из всего этого сентенция такая, что ты можешь писать inline функции в заголовочных файлах (*.h). Сие свойство было признано прийти на замену макросам в Си

==========================================================

Пример. Сделать быстрый интферфейс для вычисления квадрата числа

На Си этот вариант выглядел бы так:

C
1
2
/* Файл t.h */
#define SQR(x) ((x)*(x))
C
1
2
3
4
5
6
7
8
9
10
/* Файл t.c */
#include "t.h"
 
void func (void)
{
  int x, y;
  ...
  x = SQR (y);
  ...
}
При этом использование макроса даёт побочный эффект в тех случаях, когда аргумент являеет НЕреентрабельным (т.е. каждое обращение к аргументу может менять его значение). Например, нижеследующий код с такми вариантом построения макроса SQR отработает некоректно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Файл t.c */
#include "t.h"
 
static int a = 1;
int f1 (void)
{
  return a++;
}
 
void func (void)
{
  int x;
  x = SQR (f1());
}
а вот если написать вот так, то тогда будет работать правильно:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Файл t.c */
#include "t.h"
 
static int a = 1;
int f1 (void)
{
  return a++;
}
 
void func (void)
{
  int x, tmp;
  tmp = f1();
  x = SQR (tmp);
}
Приразработке языка Си++ авторы постарались учесть сие неудобство и в качестве решения предложили использовать inline-функции. Работа с ними уже не вызывает побочных эффектов. В случае Си++ файл t.h следует написать вот так:

C++
1
2
3
4
5
/* Файл t.h */
inline int SQR (int x)
{
  return x * x;
}
В этом случае компилятор сам вправе решать, делать ему inline-подстановку, или не делать. Если не делать, то всё равно код остаётся корректным и не будет конфликтовать сдругими моулями, где компилятор так же решил НЕ делать подставноку. Итого, хоть мы и имеем функцию, но работать она будет так же быстро, как и макрос (естественно, считаем, что компилятор работает адекватно)

Вышеописанный вариант SQR в виде inline-функции более правильно делать в виде шаблона, чтобы так же как и макрос работало для произвольных типов. Но я просто привёл пример для демонстрации того, как этим пользоваться. Надо заметить, что техническая реализация инстанциации шаблонной функции в компиляторе выполняется точно так же, как и для функции с модификатором inline, именно поэтому не возникает конфликтов при линковке
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 15:17     Зачем нужен inline #12
Для декларирования weak символов есть специальные на то конструкции. Использовать для этого inline неправильно.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 16:44     Зачем нужен inline #13
Цитата Сообщение от Vourhey Посмотреть сообщение
Для декларирования weak символов есть специальные на то конструкции. Использовать для этого inline неправильно.
Я нигде не писал, что модификатор inline используется для декларирования weak'ов. Я писал, что с тезнической точки зрения процедура с модификатором inline становится weak'ом. Тем, кто знает что такое weak, эта фраза заменяет все последующие пояснения
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 16:46     Зачем нужен inline #14
Цитата Сообщение от Evg Посмотреть сообщение
Тем, кто знает что такое weak
объяснять, что такое инлайн на фиг не нужно )))
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 17:08     Зачем нужен inline #15
Цитата Сообщение от Vourhey Посмотреть сообщение
объяснять, что такое инлайн на фиг не нужно )))
С учётом того, что те кто знали, почему-то должным образом не написали...
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 17:12     Зачем нужен inline #16
Evg, я считаю ты, как раз, не должным образом написал.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 17:14     Зачем нужен inline #17
Цитата Сообщение от Vourhey Посмотреть сообщение
Evg, я считаю ты, как раз, не должным образом написал.
Тогда напиши сам, как считаешь должно быть должным образом. Автор спрашивал не "что такое inline", а "зачем нужен inline"
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 17:34     Зачем нужен inline #18
Цитата Сообщение от Syltan Посмотреть сообщение
и там говорится мимолётом, что эта функция повысит эффективность
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
Evg
Эксперт CАвтор FAQ
17413 / 5651 / 355
Регистрация: 30.03.2009
Сообщений: 15,476
Записей в блоге: 26
07.10.2009, 18:06     Зачем нужен inline #19
Цитата Сообщение от Vourhey Посмотреть сообщение
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
Убери модификатор и на большинстве компиляторов на высоких уровнях оптимизации ничего не изменится, ибо все они (компиляторы) на этот признак скорее всего кладут и сам решают, инлайнить или нет. Об этом уже писали (в том числе и ты). Поэтому с точки зрения подстановки кода этот модификатор как таковой не нужен

Принципиальное отличие при наличия модификатора я описал. Что там написано не должным образом - я не знаю, этот посыл ты объяснять не возжелал. Дальнейший разговор больше смахивает на детский сад и неконструктивный флуд
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2009, 22:36     Зачем нужен inline
Еще ссылки по теме:

C++ Зачем нужен virtual деструктор?
C++ Зачем нужен malloc?
C++ Зачем нужен полиморфизм
Зачем нужен extern? C++
Зачем нужен конструктор переноса? C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.10.2009, 22:36     Зачем нужен inline #20
Evg очень хорошо все описал.
Yandex
Объявления
07.10.2009, 22:36     Зачем нужен inline
Ответ Создать тему
Опции темы

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