В С++ могут ли конструктор и деструктор быть встроенными функциями?
-
09-06-2019 - |
Вопрос
VС++ создает функции, которые реализуются внутри встроенных функций объявления класса.
Если я объявлю класс Foo
следующим образом, тогда являются ли встроенные функции CONSTRUCTOR и DESTRUCTOR?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
Решение
Определение тела конструктора ВНУТРИ класса имеет тот же эффект, что и размещение функции ВНЕ класса с ключевым словом «inline».
В обоих случаях это подсказка компилятору.«Встроенная» функция не обязательно означает, что функция будет встроенной.Это зависит от сложности функции и других правил.
Другие советы
Короткий ответ: да.Любую функцию можно объявить встроенной, и один из способов сделать это — поместить тело функции в определение класса.Вы также могли бы сделать:
class Foo
{
int* p;
public:
Foo();
~Foo();
};
inline Foo::Foo()
{
p = new char[0x00100000];
}
inline Foo::~Foo()
{
delete [] p;
}
Однако компилятору решать, действительно ли он встраивает функцию.VC++ практически игнорирует ваши запросы на встраивание.Он встроит функцию только в том случае, если сочтет это хорошей идеей.Последние версии компилятора также будут встраивать элементы, находящиеся в отдельных файлах .obj и не объявленные встроенными (например,из кода в разных файлах .cpp), если вы используете генерация временного кода ссылки.
Вы можете использовать __forceinline Ключевое слово, сообщающее компилятору, что вы действительно имеете в виду именно это, когда говорите «встроить эту функцию», но обычно оно того не стоит.Во многих случаях компилятор действительно знает лучше.
Помещение определения функции в тело класса эквивалентно маркировке функции ключевым словом inline.Это означает, что функция может быть встроена или не встроена компилятором.Думаю, лучшим ответом будет «может быть»?
Да, в той же степени, в которой мы можем сделать любую другую функцию встроенной.
Встраивать или нет в основном решает ваш компилятор.Встроенные в коде лишь подсказки компилятору.
Одно правило, на которое вы можете положиться, заключается в том, что виртуальные функции никогда не будут встроены.Если ваш базовый класс имеет виртуальный конструктор/деструктор, ваш, вероятно, никогда не будет встроенным.