Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем нужен inline 
:(
    Опции темы
Syltan
  Дата 6.10.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 301
Регистрация: 31.8.2009

Репутация: -1
Всего: -2



Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и не понял зачем она нужна. Желательно пример с комментарием. Зараннее благодраю за скорый ответ.
PM MAIL   Вверх
niXman
Дата 6.10.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: нет
Всего: 0



Предписывает компилятору сделать функцию/метод встраиваемым. Что экономит ресурсы проца на вызовах. Но не все функции могут быть встраиваемыми.

Это сообщение отредактировал(а) niXman - 6.10.2009, 23:00
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
jonie
Дата 6.10.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Syltan, inline советует компилятор встроить вызов как есть (т.е. встроить тело функции в код, а не вызывать некий участок кода, передавая ему параметры).

Компилятор вправе не слушать вас ).

Например можно повысить эффуктивность get операций:
Код

class  A{
int a;
public:
inline void get_a_b(int b);
}

void A::get_a_b { return a+b;};

в момент вызова A::get_a() у вас не будет передачи параметра b, а будет "вписано" по сути: offsetof(A object)->a + b

вообще inline забудьте, он в 99% случаев не нужен, т.к. современные оптимизаторы и не хуже вас разбираются "нужен тут inline или нет"....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bsa
Дата 6.10.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



jonie, он нужен в случае:
Код
class MyClass
{
    inline void myMethod();
};


void MyClass::myMethod()
{
}

PM   Вверх
niXman
Дата 6.10.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: нет
Всего: 0



bsa, Почему-то мне думается, что если в методе будет нечто вроди:
Код

void MyClass::myMethod()
{
   return a + b;
}

он все равно будет встраиваемый.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
jonie
Дата 6.10.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



bsa, да нафиг он современным оптимизаторам не нужен... скорость на этом особую не выиграешь в большинстве приложений, а где надо (драйвера для обработки видео например) - там профилировщик покажет узкие места.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Remiznik
Дата 6.10.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



если я не ошибаюсь то если на писать так 

Код

class  A{
int a;
public:
      void get_a_b(int b){ return a+b;};
}


то метотд get_a_b компилятор зделаеть inline ?
PM MAIL   Вверх
jonie
Дата 6.10.2009, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Remiznik, как я и писал выше, это не приказ компилятору - только совет. Компилятор может вообще от класса избавиться в итоговом коде... (хотя на определенных компиляторах можно выставить опции так, что inline будет приказом, но это скорее исключение из правил).
А на ваш ответ - да, это рассматривается как будто написано с inline.

Это сообщение отредактировал(а) jonie - 6.10.2009, 23:57


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Remiznik
Дата 7.10.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



я гдето читал что если компилятор не сможет встаить метод как inline то он его сделает обычным методом и будет сним работать как с обычнм !
PM MAIL   Вверх
niXman
Дата 7.10.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: нет
Всего: 0



Именно так.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
mes
Дата 7.10.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Remiznik @  6.10.2009,  22:33 Найти цитируемый пост)
Код

public:
      void get_a_b(int b){ return a+b;};


то метотд get_a_b компилятор зделаеть inline ? 

ага

Цитата("9.3")

2 A member function may be defined (_dcl.fct.def_) in its class  defini-
  tion,  in which case it is an inline member function (_dcl.fct.spec_),
  or it may be defined outside of its class definition if it has already
  been declared but not defined in its class definition...
3 An  inline  member  function (whether static or nonstatic) may also be
  defined outside of its class definition provided either  its  declara-
  tion  in  the  class definition or its definition outside of the class
  definition declares the function as inline...


P.S. сквозь несколько постов просочилась опечатка, в которой возвращающая значение функция декларирована как void. smile

Это сообщение отредактировал(а) mes - 7.10.2009, 09:43


--------------------
PM MAIL WWW   Вверх
zim22
Дата 7.10.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(bsa @  6.10.2009,  23:08 Найти цитируемый пост)

Код

class MyClass{    
  inline void myMethod();
};
void MyClass::myMethod(){}


можно и наоборот
Код

class MyClass{    
  void myMethod();
};
inline void MyClass::myMethod(){}





--------------------
PM MAIL   Вверх
azesmcar
Дата 7.10.2009, 09:46 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



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

Это сообщение отредактировал(а) azesmcar - 7.10.2009, 09:48
PM   Вверх
Леопольд
Дата 7.10.2009, 10:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(azesmcar @  7.10.2009,  09:46 Найти цитируемый пост)
Встраивается не функция а вызов функции (она может быть встраиваемой в одном участке кода и не встраиваемой в другом) а ключевое слово inline лучше не писать, позвольте компилятору самому решать, он больше знает об этом чем вы.

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


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 7.10.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Леопольд @ 7.10.2009,  10:17)
Однако при помощи inline можно влиять на способ компоновки. Именно поэтому все функции определённые в теле класса по умолчанию являются инлайн, иначе программа не скомпонуется., потому что, как правило, определение класса находится в заголовочном файле, и таким образом может быть нарушенно ODR (правило одного определения), а инлайн функции не подчиняются ему.

Именно это я и имел в виду, когда приводил свой пример - если реализация метода вне тела класса, но в хидере, то необходимо указывать inline.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.