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

c++ constructor destructor

65365 просмотра

5 ответа

5695 Репутация автора

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

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

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

{
    Foo f;
    (f);
}
Автор: popopome Источник Размещён: 21.08.2008 10:02

Ответы (5)


64 плюса

0 Репутация автора

Решение

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

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

Автор: user2189331 Размещён: 21.08.2008 10:10

4 плюса

592 Репутация автора

Помещение определения функции в тело класса эквивалентно маркировке функции ключевым словом inline. Это означает, что функция может быть или не быть встроенной компилятором. Итак, я думаю, что лучший ответ будет «возможно»?

Автор: Mickey Размещён: 21.08.2008 10:11

28 плюса

21450 Репутация автора

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

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:12

2 плюса

15387 Репутация автора

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

Автор: DrPizza Размещён: 21.08.2008 10:12

2 плюса

1408 Репутация автора

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

Автор: Rodney Schuler Размещён: 21.10.2008 04:00
Вопросы из категории :
32x32