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

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

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

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

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

Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и не понял зачем она нужна. Желательно пример с комментарием. Зараннее благодраю за скорый ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2009, 23:36     Зачем нужен inline
Посмотрите здесь:

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

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

Объяснить зачем нужен i - C++
#include <iostream> #include <conio.h> using namespace std; int main() { cout << "Enter chislo and stepen: "; ...

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

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

Зачем нужен static - C++
Объясните зачем нужно объявлять перменные за типом статик, что это даёт я так и не понял. Почему объявлять нужно в классе, а потом ещё и за...

Зачем нужен конструктор? - C++
Всем доброго дня. Ребят такая проблема объясните мне на пальцах для чего нужен конструктор в классах. Я уже столько толмудов перерыл но...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 17:12     Зачем нужен inline #16
Evg, я считаю ты, как раз, не должным образом написал.
Evg
Эксперт CАвтор FAQ
17540 / 5778 / 370
Регистрация: 30.03.2009
Сообщений: 15,911
Записей в блоге: 26
07.10.2009, 17:14     Зачем нужен inline #17
Цитата Сообщение от Vourhey Посмотреть сообщение
Evg, я считаю ты, как раз, не должным образом написал.
Тогда напиши сам, как считаешь должно быть должным образом. Автор спрашивал не "что такое inline", а "зачем нужен inline"
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.10.2009, 17:34     Зачем нужен inline #18
Цитата Сообщение от Syltan Посмотреть сообщение
и там говорится мимолётом, что эта функция повысит эффективность
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
Evg
Эксперт CАвтор FAQ
17540 / 5778 / 370
Регистрация: 30.03.2009
Сообщений: 15,911
Записей в блоге: 26
07.10.2009, 18:06     Зачем нужен inline #19
Цитата Сообщение от Vourhey Посмотреть сообщение
Я уже написал, зачем он нужен. Чтобы убрать оверхед и повысить скорость выполнения. Именно с этой целью используется inline-подстановка.
Убери модификатор и на большинстве компиляторов на высоких уровнях оптимизации ничего не изменится, ибо все они (компиляторы) на этот признак скорее всего кладут и сам решают, инлайнить или нет. Об этом уже писали (в том числе и ты). Поэтому с точки зрения подстановки кода этот модификатор как таковой не нужен

Принципиальное отличие при наличия модификатора я описал. Что там написано не должным образом - я не знаю, этот посыл ты объяснять не возжелал. Дальнейший разговор больше смахивает на детский сад и неконструктивный флуд
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.10.2009, 22:36     Зачем нужен inline #20
Evg очень хорошо все описал.
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
12.02.2011, 17:01     Зачем нужен inline #21
Цитата Сообщение от Evg Посмотреть сообщение
Если по простому, то функцию с модификатором inline можно помещать в файл *.h. Даже если функция не будет проинлайнена, то множественное её определение в разных модулях компиляции не вызовет слома при линковке.
На самом деле есть ещё одно назначение, явным образом не упомянутое в данной теме.

Например, если на момент объявления функции некоторые типы данных используемые в ней ещё не определены, то как раз модификатор inline позволяет такой функции отложить её определение до момента первого встраивания. Ещё точно такой же эффект можно получить сделав функцию шаблонной. Такие финты ушами особо ценятся при использовании кодогенерации.
Evg
Эксперт CАвтор FAQ
17540 / 5778 / 370
Регистрация: 30.03.2009
Сообщений: 15,911
Записей в блоге: 26
13.02.2011, 00:06     Зачем нужен inline #22
Цитата Сообщение от Adler Посмотреть сообщение
На самом деле есть ещё одно назначение, явным образом не упомянутое в данной теме.

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

C++
1
2
3
4
5
6
7
8
9
10
inline void
func (struct s s)
{
  s.x = 0;
}
 
struct s
{
    int x;
};
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 13:17     Зачем нужен inline #23
немогу понять
не компилиться
C++
1
2
3
4
5
// mystring.h
ostream& operator<<(ostream& out,MyString &s)
{
    return out<<s.c_str();
}
компилиться
C++
1
2
3
4
5
// mystring.h
inline ostream& operator<<(ostream& out,MyString &s)
{
    return out<<s.c_str();
}
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.09.2012, 13:56     Зачем нужен inline #24
maxon887, если тело функции находится в хедер-файле, то функция должна быть явно или неявно помечена как inline.
Цитата Сообщение от maxon887 Посмотреть сообщение
не компилиться
потому что нарушается ODR(One Definition Rule)
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 15:20     Зачем нужен inline #25
во первых я думал что я перегружаю функцию, так как такие параметры (ostream& out,MyString &s)только у меня
Во вторых. правило не нарушаеться ? функция всё ровно же опять определяеться?
ну и наконец. Вопрос у меня напрасился почти сразу как только начал читать топик, зачем нужно неосколько раз определять функцию???????
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.09.2012, 15:34     Зачем нужен inline #26
maxon887, создайте новую тему и четко изложите проблему, две строки кода и " я думал что я..." это не четко
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 16:07     Зачем нужен inline #27
понимаю что ни чётко, извините
чуть попоже создам когда пойму точно в чём я хочу разобраться))

Добавлено через 8 минут
ответ на вопрос "Зачем нужен inline?", повысить производительность - я считаю неправильным.Так как без модификатора у меня не скопилировалось.
Ответ - для того что, бы определять функции несколько раз.Поднимает встречный вопрос: зачем определять функции несколько раз?
Evg
Эксперт CАвтор FAQ
17540 / 5778 / 370
Регистрация: 30.03.2009
Сообщений: 15,911
Записей в блоге: 26
19.09.2012, 16:22     Зачем нужен inline #28
Цитата Сообщение от maxon887 Посмотреть сообщение
зачем определять функции несколько раз?
Чтобы помещать их в *.h файлах. Вкратце как работает #include - см. тут: Для чего нужен define?
Notoriously
59 / 59 / 22
Регистрация: 06.07.2016
Сообщений: 365
25.01.2017, 23:47     Зачем нужен inline #29
Цитата Сообщение от Evg Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
#include "t.h"
static int a = 1;
int f1 (void)
{
    return a++;
}
void func (void)
{
    int x;
    x = SQR (f1());
}
Почему данный код отрабатывает некорректно?
Причем, в данной интерпретации ответом будет 0, а если написать
C
1
return ++a;
Мне (файл .cpp, IDE - VS) выдает 2.

Добавлено через 26 минут
И как я понимаю,минусы использования inline это :
1.Увеличение объема кода в конечном файле,полученном после процессирования. То есть, объема будущего exe-шника.
2.Она может просто не вызваться, так как это лишь запрос,а не команда компилятору.
И основные причины, того что компилятор не посчитает за нужное ее вставлять в код,а будет работать с ней как с обычной функцией это :
2.1. Наличие рекурсии в коде.
2.2.Наличие в коде циклов. (В MSDN такого не увидел, но Шилдт пишет, что кое-где и это может послужить причиной).
2.3.Наличие переменных, объявленных ,как статические.
2.4(Не очень понятное мне, взято из MSDN) В качестве таких используются функции, на которые создаются ссылки посредством указателя в любом месте блока трансляции.
В тоже время второго недостатка define же лишен начисто,это ведь именно директива , "дающая" конкретную команду препроцессору. И в С++ не будет ошибкой , если все-таки использовать ставший привычным define?

Добавлено через 28 минут
И должна ли встраиваемая функция быть определена до ее вызова или же можно как и с обычной функцией просто записать ее прототип,а определить ее в другом месте? Просто так написано у Шилтда,но я в этом не уверен,так как в других местах информацию об этом не нашел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2017, 00:42     Зачем нужен inline
Еще ссылки по теме:

Зачем нужен operator++(int) - C++
Очень тупой вопрос - для чего нужен operator++(int)? Ну, то есть, понятно что он делает постинкремент. Непонятно почему этот инкремент не...

Зачем нужен .def - файл? - C++
Не так давно, где-то лет 5 назад, когда я учился писать первые программы на С++, я установил Borland C++ 5.0 (поскольку МАДИшный Borland C...

Зачем нужен конструктор переноса? - C++
Зачем нужен конструктор переноса если тоже самое можно реализовать в обычном конструкторе копирования. Ну вот пример: ...

Зачем нужен стек и очередь - C++
Не как не могу понять примение стека и очереди. Может кто то объясните зачем они нужны? я знаю как они работают, как простотой код для...

Зачем здесь нужен static - C++
Дело в том что без него (без static) программка не работает корректно.


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

Или воспользуйтесь поиском по форуму:
Renji
1877 / 1275 / 290
Регистрация: 05.06.2014
Сообщений: 3,636
26.01.2017, 00:42     Зачем нужен inline #30
Цитата Сообщение от Notoriously Посмотреть сообщение
Почему данный код отрабатывает некорректно?
Потому что SQR (f1()) эквивалентно копипасту (f1())*(f1()). Обратите внимание на число вызовов f1 и слово "копипаста". Про компиляцию и смысл вставляемого текста define макросы не знают и знать не хотят.
Цитата Сообщение от Notoriously Посмотреть сообщение
В тоже время второго недостатка define же лишен начисто,это ведь именно директива , "дающая" конкретную команду препроцессору.
А теперь попробуйте объявить переменную SQR.
Yandex
Объявления
26.01.2017, 00:42     Зачем нужен inline
Ответ Создать тему
Опции темы

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