Компиляторы обычно могут перемещать код между единицами перевода, поэтому они не должны иметь разницы. Лично я предпочитаю это (все в заголовке):
// math.h
class Math
{
public:
static int sum(int a, int b);
};
inline int Math::sum(int a, int b)
{
return a + b;
}
Поэтому я предпочитаю это в том, что бывают случаи, когда даже лучшие оптимизирующие компиляторы могут не встроенный код, если вы поместите его в файл CPP, как если математика класс был экспортирован (без встраивания через границы DLL, например). Я не люблю делать исключения из моего стиля кодирования, поэтому для его включения в заголовок гарантируется компилятор для inline it (если он так выбирает).
Вторая причина, по которой я предпочитаю этот явный стиль вложениях непосредственно в определение класса, заключается в том, что я работаю с множеством ленивых кодировщиков, которые часто вводят строки только потому, что это экономит время для написания, а не собственно встраивается после сеанса профилирования это, как правило, единственный раз, когда вы должны учитывать вложение, если вы не являетесь превосходным компилятором/сборщиком).
В качестве важного примечания, довольно часто обнаруживается, что вложение не оказывает заметного улучшения в производительности, и есть много случаев, когда неинъекционный код лучше, чем его вложение. Я нашел, что это даже относится к простым функциям доступа к одной линии: только потому, что код, когда он встроен, требует меньше инструкций, чем для вызова функции, не всегда означает, что компилятор будет работать с ним лучше. Over-inlining может на самом деле путать компиляторы (например, не используя регистры очень эффективно из-за слишком большого количества встроенного, исключительного кода доступа к памяти). Вложение действительно должно выполняться с осторожностью и помощью профилировщика.
Соответствующее примечание: компилятор Microsoft позволяет программистам переопределять свой встроенный анализ с помощью '__forceinline' http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx – sbk
Не совсем верно, поскольку функции маркировки как' inline' допускает множество определений в программе. Функции, определенные в классе, помечены как неявно. Но функций, определенных в пространствах имен, нет, поэтому для них необходимо «inline», чтобы они могли быть определены в заголовках. Я думаю, что это намного больше, чем «предложение компилятору». Я согласен с вами в первом пункте: независимо от того, является ли какой-либо вызов встроенным, полностью зависит от компилятора, но это не единственная точка ключевого слова 'inline'. –
просто добавьте, что функции шаблона также, конечно, автоматически встроены в несколько правил определения.Основная точка зрения Йоханнеса стоит, хотя ключевое слово inline - это больше, чем подсказка, поскольку это необходимо в некоторых случаях (неглавная функция в заголовке). –