Подтвердить что ты не робот

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

Если у вас есть метод, и вы хотите дать компилятору намек на то, что это хорошая идея, чтобы встраивать его, в настоящее время у вас есть два решения. Первый - определить методы при объявлении вашего класса:

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, говорит о том, что это не так.

4b9b3361

Ответ 1

Ключевое слово inline считается подсказкой для компиляторов, однако большинство компиляторов гораздо лучше решают, что делать, чем программисты, поэтому обычно игнорируют этот намек.

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

Также обратите внимание, что inlining происходит на сайте функции, поэтому нет смысла говорить, что функция встроена, поскольку она может быть встроена в некоторые места, а не в другие (в зависимости от кода вокруг него).

Мой совет: используйте то, что считаете более читаемым, так как оно не будет влиять на фактическое вложение (если вы не используете какой-то компилятор, например, __forceinline (дон ' t сделать это)).

Ответ 2

У современных компиляторов (я думаю о gcc, clang, Intel, Visual Studio) более вероятно встроить функцию-член, объявленную внутри класса, чем функция-член, объявленная вне класса с ключевым словом inline?

Это не имеет никакого значения.

Как отмечали другие, в современном компиляторе inline есть не что иное, как модификатор привязки. Фактическая инкрустация контролируется флажками оптимизации, требованиями к привязке и атрибутами, специфичными для компилятора.

Ответ 3

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