Память при создании переменной типа class

160
09 января 2018, 14:55

Когда мы создаем переменную int var = 5, все понятно, компьютер берет (выделяет) память 32 бита и записывает туда значение 5 в двоичном виде.

Но что происходит когда мы создаем переменную типа класс? class a = 5. Что происходит? Сколько байт выделяется под эту переменную?

Answer 1

Объект в стеке

В программе выделяется столько байт, сколько требуется для хранения данных экземпляра данного класса. Например, объект пустого класс займёт один байт, если в нём хранится int, то его размер прибавится к размеру объекта класса. Вот интересный код для исследования этих свойств:

#include <iostream>
using namespace std;
class EmptyClass
{    
};
class AbstractClass
{
  public: 
          virtual void funcOne() = 0;
          virtual void funcTwo() = 0;
};
class NotAbstrClass
{
  public: int virtFunc( int );
};
class VarClass
{
  public:
          static int i;
          int j, k;
};
int main()
{
    // Вывод размера экземпляров классов
    // Размер класса равен размеру экземпляра класса
    EmptyClass e = EmptyClass();
    cout<<"Size of empty class: "<< sizeof(e)<<endl;          
    cout<<"Size of Abstract class: "<< sizeof(AbstractClass)<<endl;
    cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
    cout<<"Size of Var class: "<< sizeof(VarClass)<<endl;
    return 0;
}

Результат выполнения с моим компилятором:

Size of Empty class: 1
Size of Abstract class: 8
Size of Non Abstract class: 1
Size of Var class: 8

Меняя число переменных можно заметить, что поля с модификатором static не влияют на размер выделенной памяти, что и логично, ведь она не относится к конкретным экземплярам класса.

Объект в куче

При динамическом создании объекта, то есть, выделении памяти в куче, помимо размера самого экземпляра класса можно учесть также и размер указателя на него:

EmptyClass *v = new EmptyClass();
cout<<"Size of pointer: "<< sizeof(v)<<endl;
cout<<"Size of object: "<< sizeof(*v)<<endl;

Получается даже, что размер указателя может быть больше самого объекта:

Size of pointer: 8
Size of object: 1
Answer 2

В первом случае - int var = 5; - компилятор выделяет sizeof(int) байтов памяти под переменную var. Это совсем не обязательно 32 бита.

Во втором случае - Class a = 5; - компилятор точно таким же образом выделяет sizeof(Class) байтов под переменную a. Все совершенно единообразно.

Выделение памяти в таких примерах никоим образом не зависит правой части данного объявления, т.е. = 5 никак не влияет на размер выделяемой памяти.

А затем, когда память уже выделена, значение 5 используется в качестве инициализатора для нового объекта. Как именно оно используется - зависит от конкретного типа. В первом случае оно просто заносится в переменную var. А что произойдет во втором случае уже зависит от деталей типа Class. Инициализация в С++ - процесс, описываемый целым набором весьма запутанных правил.

READ ALSO
Удаление из вектора и файла

Удаление из вектора и файла

Не знаю как удалять студентов из класса ГруппСтуденты добавляются из файла или с помощью функции addStudent

173
Сборка ANGLE под x86

Сборка ANGLE под x86

Собираю ANGLE в студии VS2017, под windows, по инструкцииЗадаю конфигурацию x86 (32bit) и генерирую проект для студии с помощью:

145
проблема с getch() в игре

проблема с getch() в игре

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

138