подскажите, есть ли сейчас смысл использовать ключевое слово 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
Здравствуйте, 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>
Здравствуйте, 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
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Предполагаю что некоторые компиляторы могут использовать "non-mandatory inline" как hint, либо автор кода так думает
у меня тоже есть такая гипотеза
хотелось бы узнать работает ли этот хинт как минимум для двух компиляторов (я с другими не работаю =)) ) : gcc / VS ?
Здравствуйте, 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 файле.
Здравствуйте, 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-2010template <>
inline void f<int>() {}
Здравствуйте, Alexander G, Вы писали:
AG>В этом случае почти не имеет смысла, кроме полной специализации:
Прошу прощения, но я правильно понимаю, что шаблонные функции неявно inline'овые?
Здравствуйте, flаt, Вы писали:
AG>>В этом случае почти не имеет смысла, кроме полной специализации: F>Прошу прощения, но я правильно понимаю, что шаблонные функции неявно inline'овые?
Они ведут себя подобно inline'овым (см. выше цитату из стандарта, 3.2/5 — там и про специализации есть).
Здравствуйте, Alexander G, Вы писали:
AG>В этом случае почти не имеет смысла, кроме полной специализации:
[...] AG>Тогда, для единообразия, пишу inline везде.
Специализации шаблонов функций нужны достаточно редко, чтобы подстраивать остальной код под них.