Russian Qt Forum
Ноябрь 22, 2024, 06:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Определить размер памяти, занимаемый QObject  (Прочитано 6569 раз)
shasoft
Гость
« : Октябрь 15, 2012, 08:46 »

Можно как-то определить в Qt размер памяти, занимаемой QObject?
Такой вот простой код:
Код:
    QObject oTest;
    int s1 = sizeof(QObject);
    int s2 = sizeof(oTest);
s1 и s2 =  8
Однако в отладчике можно увидеть, что oTest имеет ещё кучу разных свойств из чего можно сделать вывод, что занимает он далеко не 8 байт.
Как-то можно оценить занимаемую им память?
Записан
ssoft
Гость
« Ответ #1 : Октябрь 15, 2012, 09:39 »

QObject использует в своей реализации pimpl технологию, это значит, что внутри него есть всего лишь указатель (4 байта в 32-bit системах) на реальные данные + 4 байта на виртуализацию.
Даже если добраться до внутреннего представления QObject окажется, что он использует контейнеры и др. классы, которые в свою очередь тоже используют pimpl. Поэтому точный размер, занимаемый QObject через sizeof не определить.

Не понятно зачем это необходимо.
Записан
shasoft
Гость
« Ответ #2 : Октябрь 15, 2012, 10:02 »

Сделал объекты, доступные из скрипта. Но этих объектов создается очень много, соответственно жрет много памяти. Хотел прикинуть, сколько каждый объект занимает.
Вообще интересен подход в оценке используемой памяти. Было бы интересно узнать размер используемой памяти для QHash, QMap, QVector. А то у меня 100.000 объектов, в которых в каждом QHash. Возможно, что при использовании одного общего контейнера скорость приемлемой, зато количество занимаемой памяти упадет в N-надцать раз.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 15, 2012, 10:07 »

Как-то можно оценить занимаемую им память?
Код
C++ (Qt)
#include <QtGUI>
 
int main( void )
{
for (int i = 0; i < 16; ++i) {
int * mark1 = new int;
QObject * test = new QObject();
int * mark2 = new int;
int delta = (mark2 > mark1) ? (mark2 - mark1) : (mark1 - mark2);
printf("delta[%d] = %d\n", i, delta * sizeof(int) - 16);
}
return 0;
}
 
« Последнее редактирование: Октябрь 15, 2012, 10:13 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 15, 2012, 10:20 »

Вообще интересен подход в оценке используемой памяти. Было бы интересно узнать размер используемой памяти для QHash, QMap, QVector. А то у меня 100.000 объектов, в которых в каждом QHash. Возможно, что при использовании одного общего контейнера скорость приемлемой, зато количество занимаемой памяти упадет в N-надцать раз.
С контейнерами - это уже др вопрос, здесь размер самого "экземпляра" мало что говорит. Реально размер определяется пулом который контейнер резервирует чтобы не бегать с выделением памяти для каждого элемента. В принципе любой контейнер - удовольствие дорогое и держвть 100k QHash просто неграмотно  Улыбающийся

Ну ничего, приятно видеть пытливого молодого человека  Улыбающийся
Записан
shasoft
Гость
« Ответ #5 : Октябрь 15, 2012, 10:24 »

Какой-то сомнительный способ.
С QObject дает результат 28. При этом если вместо QObject написать свой объект, который наследует QObject, то результат уже 12.
Т.е. снаследовал несколько раз и при создании получаешь уже свободный кусок памяти. Улыбающийся
Метод предполагает, что память выделяется последовательно, хотя это может быть и не так. В любом случае спасибо за идею.

До этого с Qt не сталкивался, поэтому такие вопросы про память. Да и сами контейнеры в таких количествах не создавал. Поэтому лучше спросить, прежде чем самому искать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 22.