VC ++ создает функции, которые реализуются в рамках встроенных функций объявления класса.
Если я объявлю класс Foo
следующим образом, будут ли встроенные функции CONSTRUCTOR и DESTRUCTOR?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
Определение тела конструктора INSIDE для класса дает тот же эффект, что и размещение функции вне класса с ключевым словом «inline».
В обоих случаях это подсказка компилятору. «Встроенная» функция не обязательно означает, что функция будет встроенной. Это зависит от сложности функции и других правил.
Помещение определения функции в тело класса эквивалентно маркировке функции ключевым словом 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
«намек» на компилятор