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