![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
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 |
|
|
BRE |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
BRE, ну так то да. Я для 32-битной системы сказал по привычке
![]() в 64-битной - 8 байтов |
|
|
daorus |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
указатель, например, всего 4 байта занимает Т.е. вы намекаете, что QObject внутри себя содержит указатель и поэтому sizeof(наследникQObject) == 8, и стало быть узнать сколько реально весит наследование от QObject понять нельзя, потому что придется под капотом искать QObjectData, а потом замерять sizeof(*d_ptr) и а что содержится в QObjectData хрен знает, там могут быть ещё указатели, а значит ещё объёмы и поэтому установить цену наследования от QObject практически нереально. Ход мыслей верный? кстати, что показал тест
уже как говорится вперед |
|
|
Алексей1153 |
![]()
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
daorus, дык, я ж размер не замерял - я пример привёл, что размер объекта реально может и всего 4 байта составлять.
Насчёт посчитать реальный объём - через ОС API это наверняка возможно (сам не делал, не подскажу). Только нужно задаться вопросом - зачем ![]() Если возник вопрос о том, что затратно наследоваться от QObject, то, может, этого делать просто не нужно ? Сообщение отредактировал Алексей1153 - 4.11.2010, 16:23 |
|
|
daorus |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Только нужно задаться вопросом - зачем хочется знать стоимость привычки. Речь идет о QT-разработке. Хочу узнать, если я на автомате буду объекты наследовать от QObject, чтобы вместо обычного указателя юзать QPointer<>, то сколько мне будет стоить такая привычка. Если она будет стоить, 28 байт на объект, ещё жить можно, а если пол-кило на объект, тогда лучше такую привычку не заводить. Вот собственно и хотел узнать как измерить или может сразу кто цифру назовет, какой размер оверхеда при наследовании от QObject. |
|
|
Алексей1153 |
![]()
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
daorus, ну не знаю, мне ещё ни разу не пришлось наследоваться от QObject . От его детей - приходилось, но там объектов немного, так что 28 байтов на рожу - это совершенно ни на что не влияет.
Сообщение отредактировал Алексей1153 - 4.11.2010, 16:35 |
|
|
daorus |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
daorus, функции располагаются в сегменте кода - и в единственном экземпляре для класса. Конечно же они не добавляют размер кэкземпляру класса.
Исключение - если есть виртуальные функции, то каждая такая функция увеличивает размер экземпляра класса на величину sizeof(void*) (размер указателя) |
|
|
daorus |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 30.10.2010 Пользователь №: 2163 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#13
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
сам в шоке до сих пор
|
|
|
Влад |
![]()
Сообщение
#14
|
Участник ![]() ![]() Группа: Участник Сообщений: 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. |
|
|
Алексей1153 |
![]()
Сообщение
#15
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Влад, понятно
![]() |
|
|
kwisp |
![]()
Сообщение
#16
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
#1. что происходит с int a в inept, когда я создаю два экземпляра ine? тут вопрос неосвещенным остался. по идее int a рождается в стеке и героически умирает тут же, и нет никакой разницы сколько обЪектов ine создается. Хотя умный компилятор может и рождать ничего не будет, - оптимизирует вызов к примеру и не будет создавать лишнюю неиспользуемую переменную. Хотя там предупреждение должно быть что она неиспользуемая. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 28.5.2025, 23:48 |