Встроенный метод: внутри и вне определения класса
Если у вас есть метод, и вы хотите дать компилятору намек на то, что это хорошая идея, чтобы встраивать его, в настоящее время у вас есть два решения. Первый - определить методы при объявлении вашего класса:
class Vector {
private:
double* data_;
double* size_;
double* capacity_;
public:
double& operator[](int k) {
return data_[k];
}
...
}
Поскольку этот метод может уменьшить читаемость, другим решением является использование ключевого слова inline
и определение метода вне класса:
class Vector {
private:
double* data_;
double* size_;
double* capacity_;
public:
inline double& operator[](int k);
...
}
double& Vector::operator[](int k) {
return data_[k];
}
Это делает код более читаемым (по крайней мере, я предпочитаю его). Читая мою STL, я обнаружил, что они используют сочетание двух. Некоторые методы (те, которые, как мне кажется, действительно должны быть встроены), определены в классе, а другие определены вне класса с ключевым словом inline. Файл также начинается с прокомментированного объявления класса.
Итак, мой вопрос следующий. У меня есть текущие компиляторы (я думаю о GCC, Clang, Intel и Visual Studio) с большей вероятностью встроят функцию-член, объявленную внутри класса, чем объявленная функция-член класса с ключевым словом inline?
Примечание. Этот вопрос не является дубликатом Когда следует писать ключевое слово 'inline' для функции/метода?, так как мой вопрос касается реализаций компилятора. Эти два способа сказать, что вы хотите, чтобы эти функции были встроены, эквивалентны. То, как написано STL, говорит о том, что это не так.
Ответы
Ответ 1
Ключевое слово inline
считается подсказкой для компиляторов, однако большинство компиляторов гораздо лучше решают, что делать, чем программисты, поэтому обычно игнорируют этот намек.
Основное (только?) использование для ключевого слова inline
в настоящее время позволяет ему определять функции в заголовке и не генерировать множественные ошибки ссылок (что не имеет ничего общего с вложением).
Также обратите внимание, что inlining происходит на сайте функции, поэтому нет смысла говорить, что функция встроена, поскольку она может быть встроена в некоторые места, а не в другие (в зависимости от кода вокруг него).
Мой совет: используйте то, что считаете более читаемым, так как оно не будет влиять на фактическое вложение (если вы не используете какой-то компилятор, например, __forceinline
(дон ' t сделать это)).
Ответ 2
У современных компиляторов (я думаю о gcc, clang, Intel, Visual Studio) более вероятно встроить функцию-член, объявленную внутри класса, чем функция-член, объявленная вне класса с ключевым словом inline?
Это не имеет никакого значения.
Как отмечали другие, в современном компиляторе inline
есть не что иное, как модификатор привязки. Фактическая инкрустация контролируется флажками оптимизации, требованиями к привязке и атрибутами, специфичными для компилятора.
Ответ 3
Методы, определенные внутри определения класса, по умолчанию inline
. Выбор того или другого - это, по крайней мере, незначительное препятствие для компилятора, когда дело доходит до оптимизации - это, скорее всего, не имеет значения, что вы выберете.