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

StackOverflow https://stackoverflow.com/questions/21303

  •  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.Это означает, что функция может быть встроена или не встроена компилятором.Думаю, лучшим ответом будет «может быть»?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top