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

Встроенные члены функции внутри класса

Я знаю, что объявление функции (нормальная функция, а не метод внутри класса), как inline, является хорошей практикой, когда определение функции мало для производительности и экономит время для компиляции. Но как насчет встроенных методов внутри класса Я не понимаю понятие встроенных методов внутри класса? Как определить их и как они работают.

4b9b3361

Ответ 1

но как насчет встроенных методов внутри класса?

Оба синтаксиса для встраивания функций (с использованием явного inline и определения функции-члена внутри определения класса) дают только намек на inlining для компилятора. С точки зрения производительности они равны.

В случае определения функции-члена внутри объявления класса, удобочитаемость последней должна быть вашей главной проблемой: на самом деле больно мутировать интерфейс класса с несколькими строками деталей реализации. Поэтому избегайте этого, если ваша функция-член больше одного оператора: return stuff или простая пересылка должна быть в порядке, но обычно не более того.

class MyClass
{
public:
    int f() const { return m_i; }
    int g() const;

private:
    int m_i;
};

inline int MyClass::g() const
{
    return m_i;
}

// both member-functions behave equally (except for naming)

Ответ 2

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

Он может повысить производительность скомпилированного двоичного файла, когда становится более эффективным выполнение функции без необходимости передавать параметры. Это также может быть вредным для производительности, поскольку повторение кода, который был бы в функции в каждом месте вызова, может вызвать раздувание, что уменьшает вероятность того, что ваш код будет найден в более быстрой кэш-памяти.

Ответ 3

Есть два способа предложить компилятору сделать встроенную функцию класса:

(1) Если определить функцию в объявлении класса (в заголовке)

class Human {

public:

    Human(const char* name);
    Human();

    //is implicit inline
    void lookAt(const char* name) const {
        std::cout << "I'm looking at " << name << std::endl;

    }

private:
    char _name[30]; 

}; 

(2) используйте ключевое слово inline в определении функции (в заголовке)

    //is explicit inline 
    inline void lookAt(const char* name) const {
        std::cout << "I'm looking at " << name << std::endl;

    }