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

Зачем нужен inline

06.10.2009, 23:36. Показов 45952. Ответов 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
80 / 80 / 19
Регистрация: 07.05.2009
Сообщений: 316
12.02.2011, 17:01 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Если по простому, то функцию с модификатором inline можно помещать в файл *.h. Даже если функция не будет проинлайнена, то множественное её определение в разных модулях компиляции не вызовет слома при линковке.
На самом деле есть ещё одно назначение, явным образом не упомянутое в данной теме.

Например, если на момент объявления функции некоторые типы данных используемые в ней ещё не определены, то как раз модификатор inline позволяет такой функции отложить её определение до момента первого встраивания. Ещё точно такой же эффект можно получить сделав функцию шаблонной. Такие финты ушами особо ценятся при использовании кодогенерации.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
13.02.2011, 00:06 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;
};
0
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 13:17 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();
}
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.09.2012, 13:56 24
maxon887, если тело функции находится в хедер-файле, то функция должна быть явно или неявно помечена как inline.
Цитата Сообщение от maxon887 Посмотреть сообщение
не компилиться
потому что нарушается ODR(One Definition Rule)
1
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 15:20 25
во первых я думал что я перегружаю функцию, так как такие параметры (ostream& out,MyString &s)только у меня
Во вторых. правило не нарушаеться ? функция всё ровно же опять определяеться?
ну и наконец. Вопрос у меня напрасился почти сразу как только начал читать топик, зачем нужно неосколько раз определять функцию???????
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.09.2012, 15:34 26
maxon887, создайте новую тему и четко изложите проблему, две строки кода и " я думал что я..." это не четко
1
12 / 12 / 7
Регистрация: 05.06.2012
Сообщений: 280
19.09.2012, 16:07 27
понимаю что ни чётко, извините
чуть попоже создам когда пойму точно в чём я хочу разобраться))

Добавлено через 8 минут
ответ на вопрос "Зачем нужен inline?", повысить производительность - я считаю неправильным.Так как без модификатора у меня не скопилировалось.
Ответ - для того что, бы определять функции несколько раз.Поднимает встречный вопрос: зачем определять функции несколько раз?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
19.09.2012, 16:22 28
Цитата Сообщение от maxon887 Посмотреть сообщение
зачем определять функции несколько раз?
Чтобы помещать их в *.h файлах. Вкратце как работает #include - см. тут: Для чего нужен define?
1
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
25.01.2017, 23:47 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 минут
И должна ли встраиваемая функция быть определена до ее вызова или же можно как и с обычной функцией просто записать ее прототип,а определить ее в другом месте? Просто так написано у Шилтда,но я в этом не уверен,так как в других местах информацию об этом не нашел.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
26.01.2017, 00:42 30
Цитата Сообщение от Notoriously Посмотреть сообщение
Почему данный код отрабатывает некорректно?
Потому что SQR (f1()) эквивалентно копипасту (f1())*(f1()). Обратите внимание на число вызовов f1 и слово "копипаста". Про компиляцию и смысл вставляемого текста define макросы не знают и знать не хотят.
Цитата Сообщение от Notoriously Посмотреть сообщение
В тоже время второго недостатка define же лишен начисто,это ведь именно директива , "дающая" конкретную команду препроцессору.
А теперь попробуйте объявить переменную SQR.
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
26.01.2017, 00:52 31
Цитата Сообщение от maxon887 Посмотреть сообщение
Поднимает встречный вопрос: зачем определять функции несколько раз?
Возможность "определять несколько раз" сама по себе никому не нужна. А вот возможность определять функции в заголовочных файлах как раз таки нужна. (А "определять несколько раз" уже будет просто побочным эффектом того, что заголовочный файл может быт включен много раз в разные единицы трансляции).

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

Это также необходимо для поддержания такого свойства языка, как дедукция типа возвращаемого значения функции

C++
1
auto foo() { return 1; } // Функция возвращает int
При классическом разделении на прототип и определение выполнять дедукцию в прототипе было бы невозможно, ибо тела функции там нет и его не видно.
0
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
26.01.2017, 01:00 32
Цитата Сообщение от Renji Посмотреть сообщение
А теперь попробуйте объявить переменную SQR
Ну,это да.
Цитата Сообщение от Renji Посмотреть сообщение
эквивалентно копипасту
Да,понял.
0
26.01.2017, 01:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2017, 01:00
Помогаю со студенческими работами здесь

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

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

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

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


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

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