есть ли смысл в inline?
От: uzhas Ниоткуда  
Дата: 08.12.13 15:06
Оценка:
подскажите, есть ли сейчас смысл использовать ключевое слово inline ?
более конкретно, имеет ли смысл писать его при определении шаблонных функций и методов класса внутри опредления класса (они ведь по стандарту inline?) ?
template <typename T>
inline T sum(t a, T b) // зачем ?
{
  return a + b;
}

class A
{
public:
  inline int foo() { return 1; } // зачем ?
}


я не против использования inline при определении нешаблонной функции в .h файле, но другие случаи почему-то вызывают диссонанс
если просмотреть тот же буст, то там дофига таких странных inline
Re: есть ли смысл в inline?
От: Abyx Россия  
Дата: 08.12.13 15:11
Оценка:
Здравствуйте, uzhas, Вы писали:

U>подскажите, есть ли сейчас смысл использовать ключевое слово inline ?

U>более конкретно, имеет ли смысл писать его при определении шаблонных функций и методов класса внутри опредления класса (они ведь по стандарту inline?) ?
U>
U>template <typename T>
U>inline T sum(t a, T b) // зачем ?
U>{
U>  return a + b;
U>}

тут наверное не нужно, но всеравно пишу по привычке.

U>class A
U>{
U>public:
U>  inline int foo() { return 1; } // зачем ?
U>}
U>


тут 100% не нужно, никогда так не пишу.
In Zen We Trust
Re: есть ли смысл в inline?
От: Evgeny.Panasyuk Россия  
Дата: 08.12.13 23:57
Оценка:
Здравствуйте, uzhas, Вы писали:

U>подскажите, есть ли сейчас смысл использовать ключевое слово inline ?

U>более конкретно, имеет ли смысл писать его при определении шаблонных функций и методов класса внутри опредления класса (они ведь по стандарту inline?) ?

Определения методов внутри класса:

7.1.2/3: A function defined within a class definition is an inline function.

ODR, inline, шаблонные функции:

3.2 One definition rule
[...]
5. There can be more than one definition of a class type (clause 9), enumeration type (7.2), inline function
with external linkage
(7.1.2), class template (clause 14), non-static function template (14.5.5), [...]


U>я не против использования inline при определении нешаблонной функции в .h файле, но другие случаи почему-то вызывают диссонанс


Предполагаю что некоторые компиляторы могут использовать "non-mandatory inline" как hint, либо автор кода так думает, либо он не знает правила где нужен inline, а где нет. (ещё как маловероятный вариант — защита от потери inline при возможной будущей трансформации шаблона функции в простую функцию. либо наоборот — обычную функцию сделали шаблоном и забыли убрать inline)

Но, если нужен inline именно как подсказка оптимизатору, то лучше использовать что-то типа BOOST_FORCEINLINE:
// BOOST_FORCEINLINE ---------------------------------------------//
// Macro to use in place of 'inline' to force a function to be inline
#if !defined(BOOST_FORCEINLINE)
#  if defined(_MSC_VER)
#    define BOOST_FORCEINLINE __forceinline
#  elif defined(__GNUC__) && __GNUC__ > 3
     // Clang also defines __GNUC__ (as 4)
#    define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))
#  else
#    define BOOST_FORCEINLINE inline
#  endif
#endif
Так понятней и читателю кода и оптимизатору.
Re[2]: есть ли смысл в inline?
От: uzhas Ниоткуда  
Дата: 09.12.13 08:33
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Предполагаю что некоторые компиляторы могут использовать "non-mandatory inline" как hint, либо автор кода так думает


у меня тоже есть такая гипотеза
хотелось бы узнать работает ли этот хинт как минимум для двух компиляторов (я с другими не работаю =)) ) : gcc / VS ?
Re: есть ли смысл в inline?
От: saf_e  
Дата: 09.12.13 09:13
Оценка:
Здравствуйте, uzhas, Вы писали:

U>подскажите, есть ли сейчас смысл использовать ключевое слово inline ?

U>более конкретно, имеет ли смысл писать его при определении шаблонных функций и методов класса внутри опредления класса (они ведь по стандарту inline?) ?
U>
U>template <typename T>
U>inline T sum(t a, T b) // зачем ?
U>{
U>  return a + b;
U>}

U>class A
U>{
U>public:
U>  inline int foo() { return 1; } // зачем ?
U>}
U>


U>я не против использования inline при определении нешаблонной функции в .h файле, но другие случаи почему-то вызывают диссонанс

U>если просмотреть тот же буст, то там дофига таких странных inline

Как подсказка компилятору, ИМХО, нет. В доках ко всем компиляторам пишут, что inline просто хинт, и компилятор сам решит, что инлайнить, а что нет.

Так что остается единственный кейс, свободностоящая ф-ция в .h файле.
Re: есть ли смысл в inline?
От: Alexander G Украина  
Дата: 09.12.13 09:46
Оценка: +1
Здравствуйте, uzhas, Вы писали:

U>подскажите, есть ли сейчас смысл использовать ключевое слово inline ?

U>более конкретно, имеет ли смысл писать его при определении шаблонных функций и методов класса внутри опредления класса (они ведь по стандарту inline?) ?
U>[c]
U>template <typename T>
U>inline T sum(t a, T b) // зачем ?
U>{
U> return a + b;
U>}

В этом случае почти не имеет смысла, кроме полной специализации:
template <class T>
void f() {}

// без inline не слинкуется при включении в разные единицы трансляции.
// по крайней мере в Visual Studio 2005-2010
template <>
inline void f<int>() {}


Тогда, для единообразия, пишу inline везде.
Русский военный корабль идёт ко дну!
Re[2]: есть ли смысл в inline?
От: flаt  
Дата: 09.12.13 10:12
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>В этом случае почти не имеет смысла, кроме полной специализации:

Прошу прощения, но я правильно понимаю, что шаблонные функции неявно inline'овые?
Re[3]: есть ли смысл в inline?
От: Evgeny.Panasyuk Россия  
Дата: 09.12.13 10:18
Оценка: 10 (1)
Здравствуйте, flаt, Вы писали:

AG>>В этом случае почти не имеет смысла, кроме полной специализации:

F>Прошу прощения, но я правильно понимаю, что шаблонные функции неявно inline'овые?

Они ведут себя подобно inline'овым (см. выше цитату из стандарта, 3.2/5 — там и про специализации есть).
Re[2]: есть ли смысл в inline?
От: Evgeny.Panasyuk Россия  
Дата: 09.12.13 10:22
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>В этом случае почти не имеет смысла, кроме полной специализации:

[...]
AG>Тогда, для единообразия, пишу inline везде.

Специализации шаблонов функций нужны достаточно редко, чтобы подстраивать остальной код под них.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.