Здравствуйте, гость ( Вход | Регистрация )
|
daorus |
4.11.2010, 14:22
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: 0
|
Захотелось мне любопытному
|
|
|
|
![]() |
|
Алексей1153 |
4.11.2010, 14:48
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
daorus, пустой класс имеет размер 1 байт. Это какие-то заморочки, необходимые компилятору (детали не знаю)
когда класс не пустой (к примеру, произведён от QObject) , то его (класса) размер становится равен размеру QObject (а единичка "пустоты" уже не учитывается) Если класс сам что-то ещё содержит, то это также учтётся в размере должен быть - но не обязательно равен, так как происходит ещё выравнивание (на 4 байта, если явно не задано другое) размер также будет одинаков для таких вариантов: Цитата(daorus @ 4.11.2010, 16:22) Link // #4. неужели сделать потомком QObject'a какой-то класс стоит всего 8 байт? // при его навороченной-то функциональности, когда он даже имена типов хранит? указатель, например, всего 4 байта занимает в исходниках нашёл нестатический мембер QObject такой QScopedPointer<QObjectData> d_ptr; Сообщение отредактировал Алексей1153 - 4.11.2010, 14:47 |
|
|
|
|
Влад |
7.11.2010, 17:25
Сообщение
#3
|
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8
|
Цитата(Алексей1153 @ 4.11.2010, 14:48) Link daorus, пустой класс имеет размер 1 байт. Это какие-то заморочки, необходимые компилятору (детали не знаю) Это вытекает из простого требования: каждый объект в памяти должен иметь уникальный адрес. Рассмотри, например, такую конструкцию: Если бы sizeof(A) был бы строго равен нулю, каковы были бы &my_array[0], &my_array[1] и так далее до &my_array[99]? Стандарт языка ведь требует, чтобы элементы массива были упакованы плотно, без пустот между ними - на этом строится адресная арифметика. А общий размер массива (sizeof(my_array))? А каковы были бы адреса переменных, объявленных "до" и "после" массива?Поэтому размер любого объекта (даже "пустого" класса) - не менее 1 байта (а более - делать можно, но весьма бессмысленно, ибо пустой расход памяти). Как только же класс A наследуется от QObject, или же наоборот - от него наследуется какой-то класс (пусть A1, и например, непустой), - конечный класс становится заведомо "непустым", и лишние байты компилятору уже не нужны. Это называется "оптимизацией пустой базы" или "оптимизацией пустого базового класса" - empty base optimization. |
|
|
|
daorus Размер объекта - наследника QObject 4.11.2010, 14:22
BRE Цитата(Алексей1153 @ 4.11.2010, 14:48) ук... 4.11.2010, 14:52
Алексей1153 BRE, ну так то да. Я для 32-битной системы сказал ... 4.11.2010, 15:06
daorus Цитата(Алексей1153 @ 4.11.2010, 16:48) ук... 4.11.2010, 16:13
Алексей1153 daorus, дык, я ж размер не замерял - я пример прив... 4.11.2010, 16:24
daorus Цитата(Алексей1153 @ 4.11.2010, 18:23) То... 4.11.2010, 16:27
Алексей1153 daorus, ну не знаю, мне ещё ни разу не пришлось на... 4.11.2010, 16:35
daorus Цитата(Алексей1153 @ 4.11.2010, 18:35) 28... 4.11.2010, 21:38
Алексей1153 daorus, функции располагаются в сегменте кода - и ... 4.11.2010, 23:45
daorus Цитата(Алексей1153 @ 5.11.2010, 1:45) фун... 5.11.2010, 11:55
Litkevich Yuriy Цитата(daorus @ 5.11.2010, 14:55) Ну, Лёх... 5.11.2010, 13:19
Алексей1153 сам в шоке до сих пор 5.11.2010, 13:42
Алексей1153 Влад, понятно 7.11.2010, 18:00
kwisp Цитата(daorus @ 4.11.2010, 14:22) #1. что... 9.11.2010, 10:52![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 15.12.2025, 10:33 |