Когда мы создаем переменную 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
. Инициализация в С++ - процесс, описываемый целым набором весьма запутанных правил.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не знаю как удалять студентов из класса ГруппСтуденты добавляются из файла или с помощью функции addStudent
Собираю ANGLE в студии VS2017, под windows, по инструкцииЗадаю конфигурацию x86 (32bit) и генерирую проект для студии с помощью:
Вот фрагмент кода игрыНужно чтобы пушка могла одновременно двигаться и стрелять но когда двигаю пушку например налево пушка останавливается...