В C ++ конструктор и деструктор могут быть встроенными функциями? - PullRequest
65 голосов
/ 22 августа 2008

VC ++ создает функции, которые реализуются в рамках встроенных функций объявления класса.

Если я объявлю класс Foo следующим образом, будут ли встроенные функции CONSTRUCTOR и DESTRUCTOR?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}

Ответы [ 5 ]

62 голосов
/ 22 августа 2008

Определение тела конструктора ВНУТРИ класса аналогично помещению функции ВНЕШНИЙ класс с ключевым словом «inline».

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

27 голосов
/ 22 августа 2008

Краткий ответ - да. Любая функция может быть объявлена ​​встроенной, и размещение тела функции в определении класса является одним из способов сделать это. Вы могли бы также сделать:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

Однако, это зависит от компилятора, если он действительно встроил функцию. VC ++ в значительной степени игнорирует ваши запросы на встраивание. Функция будет встроена только в том случае, если она считает, что это хорошая идея. В последних версиях компилятора также будут встроены элементы, которые находятся в отдельных файлах .obj и не объявлены как встроенные (например, из кода в разных файлах .cpp), если вы используете генерация временного кода ссылки .

Вы можете использовать ключевое слово __ forceinline , чтобы сказать компилятору, что вы действительно имеете это в виду, когда говорите «встроить эту функцию», но обычно это того не стоит. Во многих случаях компилятор действительно знает лучше.

4 голосов
/ 22 августа 2008

Помещение определения функции в тело класса равнозначно маркировке функции ключевым словом inline. Это означает, что функция может быть или не быть встроенной компилятором. Итак, я думаю, что лучший ответ будет "возможно"?

2 голосов
/ 21 октября 2008

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

2 голосов
/ 22 августа 2008

В той же степени, что мы можем сделать любую другую функцию встроенной, да.

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