Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/237: Рейтинг темы: голосов - 237, средняя оценка - 4.51
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
1

Зачем нужен inline

06.10.2009, 23:36. Показов 45960. Ответов 31

Author24 — интернет-сервис помощи студентам
Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и не понял зачем она нужна. Желательно пример с комментарием. Зараннее благодраю за скорый ответ.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2009, 23:36
Ответы с готовыми решениями:

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

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

Зачем нужен return?
Я читал,что return возвращает значение функции. Какое значение? Почему иногда return 0, а иногда...

зачем нужен параметр
#include"otobrazenie.h" #include "primary.h" #include <iostream> #include "execution.h"...

31
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
06.10.2009, 23:42 2
завидев такую конструкцию, компилятор может встроить тело функции немостредственно в точку вызова. таким образом код распухает, но за счёт отказа от вызова функции может работать быстрее
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
06.10.2009, 23:42 3
Компилятор просто заменяет вызов функции, кодом самой функции. Это чаще всего применяется для маленьких по размеру функций. Компилятор, все равно, сам решит инлайнить функцию или нет. А зачем пример? Самое обычное объявление функции, просто с ключевым словом inline и все.
1
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
06.10.2009, 23:45 4
Syltan, инлайн функция перемалывается компилятором так,что фактического вызова не происходит,ее код "копируется" туда,откуда она вызвана. Для часто вызываемых,но очень коротких функций, inline выгодно указывать,для остальных не принципиально. Надо сказать,что современные компиляторы плевать хотели на указание директивы инлайн, т.е посчитав,что это не выгодно,они проигнорируют желание программера. Выглядит это примерно так : "Слушай,компилятор,вот эту бы функцию хорошо бы встраивать.."... "Молчать,человечишко,мне виднее" - отвечает ему компилятор. Теоретически, после этого программер может обидеться и сказать "__forceinline",после чего железке останется только повиноваться(если это возможно). Это поведение актуально для Visual Studio. Старенький борланд си вряд ли решится спорить,но тут уж я не могу утверждать. Подробнее про поведение компилятора нужно читать в его справке. Для вижуал студии читать тут
5
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.10.2009, 23:47 5
Обрати внимание только, что inline - это не приказ, а нижайшая просьба к компилятору: "Милостивый государь, будьте так любезны, попытайтесь заинлайнить эту функцию, пожалуйста." - каковую просьбу компилятор может выполнить, а может и проигнорировать. Поэтому рассчитывать на то, что функция будет обязательно заинлайнена, нельзя. Как карта ляжет.
1
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 00:16 6
Лучший ответ Сообщение было отмечено как решение

Решение

На самом деле смысл модификатора не только в том, что это типа просьба проинлайнить функцию. Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом. Если по простому, то функцию с модификатором inline можно помещать в файл *.h. Даже если функция не будет проинлайнена, то множественное её определение в разных модулях компиляции не вызовет слома при линковке.

Причём в стандартном Си этого модификатора нет, только в Си++, Си99, GNU C. Причём во всех языках работа с модификаторм идёт по разному. Когда-то с этим вопросом пришлось поразбираться, если завтра не забуду - на работе записано должно быть
13
Эксперт С++
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
07.10.2009, 00:38 7
Цитата Сообщение от Evg Посмотреть сообщение
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Не знал,не поверил,проверил - действительно так. Спасибо за инфу
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 13:16  [ТС] 8
C++
1
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Можно вот это место расшифровать,чтоб понятно было.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 13:44 9
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
Этот модификатор переводит функцию в разряд так называемых multiply defined. Технически символ для этой функции становится weak'ом.
Можно вот это место расшифровать,чтоб понятно было.
Далее я написал "Если по простому..." - это и есть расшифровка. Те, кто разбираются, те поймут, что значит weak. Те, кто не разбираются - начиная со слов "Если по простому" следует некое грубое пояснение на пальцах
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
07.10.2009, 13:46  [ТС] 10
Хорошо,скажите что такое weak и всё?
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 14:08 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, именно поэтому не возникает конфликтов при линковке
13
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
07.10.2009, 15:17 12
Для декларирования weak символов есть специальные на то конструкции. Использовать для этого inline неправильно.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 16:44 13
Цитата Сообщение от Vourhey Посмотреть сообщение
Для декларирования weak символов есть специальные на то конструкции. Использовать для этого inline неправильно.
Я нигде не писал, что модификатор inline используется для декларирования weak'ов. Я писал, что с тезнической точки зрения процедура с модификатором inline становится weak'ом. Тем, кто знает что такое weak, эта фраза заменяет все последующие пояснения
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
07.10.2009, 16:46 14
Цитата Сообщение от Evg Посмотреть сообщение
Тем, кто знает что такое weak
объяснять, что такое инлайн на фиг не нужно )))
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 17:08 15
Цитата Сообщение от Vourhey Посмотреть сообщение
объяснять, что такое инлайн на фиг не нужно )))
С учётом того, что те кто знали, почему-то должным образом не написали...
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
07.10.2009, 17:12 16
Evg, я считаю ты, как раз, не должным образом написал.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 17:14 17
Цитата Сообщение от Vourhey Посмотреть сообщение
Evg, я считаю ты, как раз, не должным образом написал.
Тогда напиши сам, как считаешь должно быть должным образом. Автор спрашивал не "что такое inline", а "зачем нужен inline"
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
07.10.2009, 17:34 18
Цитата Сообщение от Syltan Посмотреть сообщение
и там говорится мимолётом, что эта функция повысит эффективность
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
0
Evg
Эксперт CАвтор FAQ
21280 / 8302 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.10.2009, 18:06 19
Цитата Сообщение от Vourhey Посмотреть сообщение
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
Убери модификатор и на большинстве компиляторов на высоких уровнях оптимизации ничего не изменится, ибо все они (компиляторы) на этот признак скорее всего кладут и сам решают, инлайнить или нет. Об этом уже писали (в том числе и ты). Поэтому с точки зрения подстановки кода этот модификатор как таковой не нужен

Принципиальное отличие при наличия модификатора я описал. Что там написано не должным образом - я не знаю, этот посыл ты объяснять не возжелал. Дальнейший разговор больше смахивает на детский сад и неконструктивный флуд
2
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.10.2009, 22:36 20
Evg очень хорошо все описал.
0
07.10.2009, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2009, 22:36
Помогаю со студенческими работами здесь

Зачем нужен полиморфизм
читал про то что такое полиморфизм, виртуальные методы и тд, вот промер из статьи про виртуальный...

Зачем нужен malloc?
malloc - что это? И зачем оно нужно?

Зачем нужен dynamic_cast?
Point * mas; mas = new Point(); mas = new Square(); mas = new Circle();...

Зачем нужен extern?
Знаю, что в интернете полно объяснений зачем он, но я не могу понять... Везде пишут, что он...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru