Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Зачем нужен inline


Автор: Syltan 6.10.2009, 22:51
Скажите пожалуйста, зачем нужна команда inline? Изучаю классы, и там говорится мимолётом, что эта функция повысит эффективность, но так и не понял зачем она нужна. Желательно пример с комментарием. Зараннее благодраю за скорый ответ.

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

Автор: jonie 6.10.2009, 23:01
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 или нет"....

Автор: bsa 6.10.2009, 23:08
jonie, он нужен в случае:
Код
class MyClass
{
    inline void myMethod();
};


void MyClass::myMethod()
{
}

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

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

он все равно будет встраиваемый.

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

Автор: Remiznik 6.10.2009, 23:33
если я не ошибаюсь то если на писать так 

Код

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


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

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

Автор: Remiznik 7.10.2009, 00:01
я гдето читал что если компилятор не сможет встаить метод как inline то он его сделает обычным методом и будет сним работать как с обычнм !

Автор: niXman 7.10.2009, 00:07
Именно так.

Автор: mes 7.10.2009, 09:38
Цитата(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

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

Код

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


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

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



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

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

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

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

Именно это я и имел в виду, когда приводил свой пример - если реализация метода вне тела класса, но в хидере, то необходимо указывать inline.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)