![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
daorus |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Захотелось мне любопытному
![]()
|
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
daorus, пустой класс имеет размер 1 байт. Это какие-то заморочки, необходимые компилятору (детали не знаю)
когда класс не пустой (к примеру, произведён от QObject) , то его (класса) размер становится равен размеру QObject (а единичка "пустоты" уже не учитывается)
Если класс сам что-то ещё содержит, то это также учтётся в размере
должен быть - но не обязательно равен, так как происходит ещё выравнивание (на 4 байта, если явно не задано другое) размер также будет одинаков для таких вариантов:
// #4. неужели сделать потомком QObject'a какой-то класс стоит всего 8 байт? // при его навороченной-то функциональности, когда он даже имена типов хранит? указатель, например, всего 4 байта занимает ![]() в исходниках нашёл нестатический мембер QObject такой QScopedPointer<QObjectData> d_ptr; Сообщение отредактировал Алексей1153 - 4.11.2010, 14:47 |
|
|
Влад |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
daorus, пустой класс имеет размер 1 байт. Это какие-то заморочки, необходимые компилятору (детали не знаю) Это вытекает из простого требования: каждый объект в памяти должен иметь уникальный адрес. Рассмотри, например, такую конструкцию: Если бы sizeof(A) был бы строго равен нулю, каковы были бы &my_array[0], &my_array[1] и так далее до &my_array[99]? Стандарт языка ведь требует, чтобы элементы массива были упакованы плотно, без пустот между ними - на этом строится адресная арифметика. А общий размер массива (sizeof(my_array))? А каковы были бы адреса переменных, объявленных "до" и "после" массива?Поэтому размер любого объекта (даже "пустого" класса) - не менее 1 байта (а более - делать можно, но весьма бессмысленно, ибо пустой расход памяти). Как только же класс A наследуется от QObject, или же наоборот - от него наследуется какой-то класс (пусть A1, и например, непустой), - конечный класс становится заведомо "непустым", и лишние байты компилятору уже не нужны. Это называется "оптимизацией пустой базы" или "оптимизацией пустого базового класса" - empty base optimization. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 21.6.2025, 18:38 |