Сведения о вопросе

Kirushaa

17:03, 13th August, 2020

Теги

c++   constructor   destructor    

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

Просмотров: 348   Ответов: 5

VC++ делает функции, которые реализуются в рамках объявления класса встроенными функциями.

Если я объявляю класс Foo следующим образом, то являются ли CONSTRUCTOR и DESTRUCTOR встроенными функциями?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}



  Сведения об ответе

crush

09:25, 19th August, 2020

Определение тела конструктора INSIDE класс имеет тот же эффект размещения функции OUTSIDE класса с ключевым словом "inline".

В обоих случаях это подсказка компилятору. Функция "inline" не обязательно означает, что эта функция будет встроена. Это зависит от сложности функции и других правил.


  Сведения об ответе

+-*/

23:25, 11th August, 2020

Короткий ответ-да. Любая функция может быть объявлена встроенной, и один из способов сделать это-поместить тело функции в определение класса. Вы тоже могли бы это сделать:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

Однако это зависит от компилятора, если он действительно встроит функцию. VC++ в значительной степени игнорирует ваши запросы на инлайнинг. Он будет встроен в функцию только в том случае, если считает, что это хорошая идея. Последние версии компилятора также будут встроены вещи, которые находятся в отдельных файлах .obj и не объявлены встроенными (например из кода в разных файлах .cpp) , если вы используете генерацию кода времени ссылки .

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


  Сведения об ответе

davran

10:56, 18th August, 2020

Размещение определения функции в теле класса равнозначно маркировке функции с помощью встроенного ключевого слова. Это означает, что функция может быть встроена или не встроена компилятором. Так что, я думаю, лучшим ответом будет "maybe"?


  Сведения об ответе

DO__IT

13:31, 20th August, 2020

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


  Сведения об ответе

lesha

19:25, 9th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться