Когда мы создаем переменную int var = 5, все понятно, компьютер берет (выделяет) память 32 бита и записывает туда значение 5 в двоичном виде.
Но что происходит когда мы создаем переменную типа класс? class a = 5. Что происходит? Сколько байт выделяется под эту переменную?
В программе выделяется столько байт, сколько требуется для хранения данных экземпляра данного класса. Например, объект пустого класс займёт один байт, если в нём хранится 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
В первом случае - int var = 5; - компилятор выделяет sizeof(int) байтов памяти под переменную var. Это совсем не обязательно 32 бита.
Во втором случае - Class a = 5; - компилятор точно таким же образом выделяет sizeof(Class) байтов под переменную a. Все совершенно единообразно.
Выделение памяти в таких примерах никоим образом не зависит правой части данного объявления, т.е. = 5 никак не влияет на размер выделяемой памяти.
А затем, когда память уже выделена, значение 5 используется в качестве инициализатора для нового объекта. Как именно оно используется - зависит от конкретного типа. В первом случае оно просто заносится в переменную var. А что произойдет во втором случае уже зависит от деталей типа Class. Инициализация в С++ - процесс, описываемый целым набором весьма запутанных правил.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости