В C ++ конструктор и деструктор могут быть встроенными функциями?
65365 просмотра
5 ответа
VC ++ создает функции, которые реализуются в рамках встроенных функций объявления класса.
Если я объявлю класс Foo
следующим образом, будут ли встроенные функции CONSTRUCTOR и DESTRUCTOR?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
Автор: popopome
Источник
Размещён: 22.10.2019 01:08
Ответы (5)
64 плюса
Определение тела конструктора INSIDE для класса дает тот же эффект, что и размещение функции OUTSIDE для класса с ключевым словом «inline».
В обоих случаях это подсказка компилятору. «Встроенная» функция не обязательно означает, что функция будет встроенной. Это зависит от сложности функции и других правил.
Автор: user2189331 Размещён: 21.08.2008 10:1028 плюса
Короткий ответ: да. Любая функция может быть объявлена встроенной, и размещение тела функции в определении класса является одним из способов сделать это. Вы могли бы также сделать:
class Foo
{
int* p;
public:
Foo();
~Foo();
};
inline Foo::Foo()
{
p = new char[0x00100000];
}
inline Foo::~Foo()
{
delete [] p;
}
Однако, это зависит от компилятора, если он действительно встроен в функцию. VC ++ в значительной степени игнорирует ваши запросы на встраивание. Функция будет встроена только в том случае, если она считает, что это хорошая идея. Последние версии компилятора также будут встроены в отдельные файлы .obj и не объявлены как встроенные (например, из кода в разных файлах .cpp), если вы используете генерацию временного кода ссылки .
Вы можете использовать ключевое слово __forceinline, чтобы сказать компилятору, что вы действительно имеете это в виду, когда говорите «встроить эту функцию», но обычно это того не стоит. Во многих случаях компилятор действительно знает лучше.
Автор: Wilka Размещён: 21.08.2008 10:124 плюса
Помещение определения функции в тело класса эквивалентно маркировке функции ключевым словом inline. Это означает, что функция может быть или не быть встроенной компилятором. Итак, я думаю, что лучший ответ будет «возможно»?
Автор: Mickey Размещён: 21.08.2008 10:112 плюса
В той же степени, что мы можем сделать любую другую функцию встроенной, да.
Автор: DrPizza Размещён: 21.08.2008 10:122 плюса
Встраивать или нет в основном решает ваш компилятор. Inline в коде только намеки на компилятор.
Одно правило, на которое вы можете рассчитывать, заключается в том, что виртуальные функции никогда не будут встроены. Если ваш базовый класс имеет виртуальный конструктор / деструктор, ваш, вероятно, никогда не будет встроен.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- constructor Сколько аргументов конструктора слишком много?
- constructor Когда для конструктора правильно выбрасывать исключение?
- constructor Что означает явное ключевое слово?
- constructor Конструктор по умолчанию с пустыми скобками
- constructor Статические фабричные методы против конструкторов экземпляров (нормальных)?
- destructor Есть ли деструктор для Java?
- destructor Вызывается ли деструктор, если конструктор выдает исключение?
- destructor В чем разница между использованием IDisposable и деструктором в C #?
- destructor Нужно ли явно указывать базовый виртуальный деструктор?
- destructor Будет ли «пустой» конструктор или деструктор делать то же самое, что и сгенерированный?