Как вычислитель размера С++ вычисляет размер?
Я создал класс X, имеющий только 2 общедоступные функции (конструктор и деструктор), и используя оператор sizeof
, размер класса станет равным 1.
Когда я добавляю частный элемент данных типа char
к вышеуказанному объявлению класса, размер по-прежнему равен 1.
Наконец, я добавляю к нему целочисленный тип как член данных класса, и теперь размер составляет 8 байтов.
Просьба объяснить мне, как вычисляется размер класса.
Ответы
Ответ 1
Сначала убедитесь, что функции, которые не являются виртуальными, не влияют на размер класса.
Размер экземпляра любого класса не менее 1 байт, даже если класс пуст, поэтому разные объекты будут иметь разные адреса.
Добавление char
гарантирует, что разные объекты будут иметь разные адреса, поэтому компилятор не искусственно добавляет один к размеру. Тогда размер будет sizeof(char)
= 1.
Затем вы добавляете int
, который (возможно) добавляет 4 байта на вашу платформу. Затем компилятор решает заполнить класс, чтобы он был выровнен по причинам производительности/ЦП и добавил 3 пустых байта, чтобы размер теперь составлял 1 + 3 + 4 = 8. Вероятно, он добавляет дополнение до int
чтобы он был выровнен по границе 4 байта, но это не требуется, если ваш процессор не требует этого.
Вы можете прочитать о дополнении на странице Википедии.
Ответ 2
Существует множество факторов, которые определяют размер объекта класса в С++. Эти факторы:
- Размер всех нестатических элементов данных
- Порядок элементов данных
- Байт-выравнивание или заполнение байта
- Размер его ближайшего базового класса
- Существование виртуальных функций (динамический полиморфизм с использованием виртуальных функций).
- Используется компилятор
- Режим наследования (виртуальное наследование)
Здесь вы можете найти больше http://www.cprogramming.com/tutorial/size_of_class_object.html