встроенные члены функции внутри класса - PullRequest
47 голосов
/ 21 февраля 2012

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

Ответы [ 3 ]

55 голосов
/ 21 февраля 2012

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

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

В случае определения функции-члена в объявлении класса, читаемость последнего должна быть вашейОсновная проблема: это действительно больно засорять интерфейс класса множеством строк деталей реализации.Поэтому избегайте этого, если ваша функция-член состоит более чем из одного оператора: 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)
21 голосов
/ 21 февраля 2012

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

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

18 голосов
/ 21 февраля 2012

Компилятору предлагается две опции для включения функции класса в строку:

(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) Явное использование встроенного ключевого слова в определении функции (в заголовочном файле)

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...