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

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

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

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

{
    Foo f;
    (f);
}

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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