В C ++ конструктор и деструктор могут быть встроенными функциями?

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

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

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

{
    Foo f;
    (f);
}
21.08.2008 22:02:58
5 ОТВЕТОВ
РЕШЕНИЕ

Определение тела конструктора INSIDE для класса дает тот же эффект, что и размещение функции вне класса с ключевым словом «inline».

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

69
21.08.2008 22:10:59
Это больше, чем подсказка: inline позволяет вам определять одну и ту же функцию в нескольких единицах перевода. Это является обязательным условием для встраивания функции на сайт вызова (без оптимизации времени соединения), где ключевое слово получает свое имя.
Fred Nurk 1.12.2010 11:42:00
@FredNurk, я полностью согласен с вами - однако сам Страуструп (проект и развитие C ++) ссылается на inline«намек» на компилятор
Aiden Strydom 14.05.2014 10:02:58
Как отмечалось выше, этот ответ устарел. Вот более актуальный ответ на аналогичный вопрос.
anatolyg 29.05.2017 19:41:38
Remis 5.05.2019 17:30:58

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

4
21.08.2008 22:11:43

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

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

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

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

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

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

29
21.08.2008 22:12:21

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

2
21.08.2008 22:12:26

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

2
21.10.2008 16:00:04
Кстати, виртуальные функции-члены (включая виртуальные деструкторы) могут быть встроены, если компилятор знает (полный) тип разрушаемого объекта.
Chris Peterson 14.01.2010 02:40:49