Определение класса и распределение памяти - PullRequest
2 голосов
/ 17 февраля 2010

Если определение означает назначение памяти. Почему определению класса в C ++ не назначена память, пока не будет создан экземпляр объекта.

Ответы [ 6 ]

8 голосов
/ 17 февраля 2010

Определения класса C ++ не назначают память. class похоже на typedef и struct. Откуда вы взяли, что «определение означает выделение памяти»? Можете ли вы предоставить цитату или ссылку?

C ++ Создание объекта (через new) выделяет память.

6 голосов
/ 17 февраля 2010

Определение класса компилируется в код. Этот код является частью образа процесса. Образ процесса действительно загружается в ОЗУ (и, следовательно, использует память) вашей операционной системой, но он не является частью используемого пространства памяти вашего процесса.

Когда вы создаете объект вашего класса, вы используете память в используемом пространстве памяти вашего процесса. Используемое пространство памяти процесса состоит из памяти в одном из 2 мест. Стек или куча .

Нет памяти для определения классов в стеке или в куче. Когда вы создаете объект класса, он всегда помещается в стек или кучу.

2 голосов
/ 17 февраля 2010

Объявление класса сообщает компилятору и среде выполнения , сколько памяти выделить для каждого экземпляра класса, но только по запросу. Определение класса создает исполняемый код для поведения класса.

1 голос
/ 17 февраля 2010

Это правда до определенного момента. Все классы и структуры в C / C ++ имеют 2 места с именами.

Class <Name>
{
     ...
}<Vars>;

Что вы делаете, это определяете переменные класса . Всем Vars будет выделена память для них, но то, что вы обычно делаете, пропускает часть , и вы получаете пустое определение переменных, например, запись

int;
0 голосов
/ 07 июня 2016

Информация о классе хранится в таблице символов. Как следующий код:

#include<iostream>
#include <typeinfo>
using namespace std;
class Base {
public:
    Base() { }
    virtual void test(){ }
};
class Derived: public Base {
};

int main() {
    // print Derived's info
    Base* b = new Derived;
    const char* str = typeid(*b).name();
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;

    // print Base's info
    str = typeid(Base).name();
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;
    return 0;
}

Скомпилируйте этот файл с помощью g ++ и запустите:

7Derived's address = 0x400e68
4Base's address = 0x400e98

Исполняемый файл - «a.out», и используйте команду «readelf -a a.out» для получения дополнительной информации:

Symbol table '.symtab' contains 98 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    ......
    79: 0000000000400e68     9 OBJECT  WEAK   DEFAULT   15 _ZTS7Derived
    80: 0000000000400e98     6 OBJECT  WEAK   DEFAULT   15 _ZTS4Base
    ......

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

0 голосов
/ 17 февраля 2010

Если вы определяете как указатель на класс, C ++ не автоматически выделяет память для объекта. В C ++ управление памятью должно выполняться в вашем коде, что имеет свои преимущества и недостатки в зависимости от варианта использования вашего приложения.

Class* test;

Выше не будет выделять память, по умолчанию она не указывает ни на что.

Class test;

Выше можно будет использовать, но он будет иметь локальную область.

...