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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Re: [Решено]Красиво узнать размер Qt-контейнера (с простыми типами) в байтах  (Прочитано 4702 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Июль 04, 2014, 11:56 »

Всем доброго времени.

Например, есть задача получить размер любого контейнера в байтах.
Условие: контейнеры могут принимать только простые типы (char, int, wchar_t, и пр.).

Но проблема в том, что у контейнеров (QVector, QVarLengthArray) нет такого метода.

По-простому это делается так:

Код
C++ (Qt)
QVector<int> v(10);
qint64 sizeInBytes = v.size() * sizeof(int);
 

но это как-то некошерно каждый раз писать такое..

Думал на шаблонах смастерить некоторую ф-ю которая бы автоматом считала размер контейнера в байтах,
набросал вот это:

Код
C++ (Qt)
 
template <class T>
qint64 qtContainerSize(const T &container)
{
   T::value_type datatype = T::value_type();
   return container.size() * sizeof(datatype);
}
 
QVector<int>v(10);
qint64 sizeInBytes = qtContainerSize(v);
 
 

вроде работает, но ругается так:

Цитировать

e:\git\ng\123\typeof\ttt.h(7) : warning C4189: 'datatype' : local variable is initialized but not referenced
        ..\typeof\main.cpp(13) : see reference to function template instantiation 'qint64 qtContainerSize<QVector<T>>(const QVector<T> &)' being compiled
        with
        [
            T=int
        ]


Есть ли возможность как-то красиво это реализовать? Улыбающийся
« Последнее редактирование: Июль 04, 2014, 14:32 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 04, 2014, 12:22 »

По-простому это делается так:

Код
C++ (Qt)
QVector<int> v(10);
qint64 sizeInBytes = v.size() * sizeof(int);
 
Та ну, такой размер очень далек от реального, возможно в неск раз. Напр вектор распределяет пул, правильно  v.capacity() * sizeof(int); Др контейнеры вместе с данными хранят "обвязки", напр размер эл-та QHash
sizeof(key) + sizeof(value) + sizeof(uint32) + sizeof(void *) * 2 +... // может чего-о упустил

Есть ли возможность как-то красиво это реализовать? Улыбающийся
К сожалению - нет
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #2 : Июль 04, 2014, 12:30 »

Есть ли возможность как-то красиво это реализовать? Улыбающийся
Обычный способ подавить сообщение о неиспользовании переменной - это привести ее к void
Код
C++ (Qt)
(void)datatype;

И еще, а зачем обьявлять переменную, если sizeof можно применять и к типу.
Код
C++ (Qt)
template <class T>
qint64 qtContainerSize(const T &container)
{
   return container.size() * sizeof(typename T::value_type);
}
« Последнее редактирование: Июль 04, 2014, 12:39 от alex312 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 04, 2014, 12:39 »

Q_UNUSED уж лучше тогда
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июль 04, 2014, 13:28 »

Цитата: alex312
И еще, а зачем обьявлять переменную, если sizeof можно применять и к типу.

Ах, спасибо.. Улыбающийся

Цитата: Igors
Та ну, такой размер очень далек от реального, возможно в неск раз.

Это понятно. Имелся ввиду размер используемых элементов в байтах. Улыбающийся
« Последнее редактирование: Июль 04, 2014, 13:31 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Июль 04, 2014, 14:13 »

Цитировать
Это понятно. Имелся ввиду размер используемых элементов в байтах.  Улыбающийся

А если в контейнере указатели? Или, например, QString?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Июль 04, 2014, 14:30 »

Эмм.. таки да.  Строит глазки

Но у меня нет такой общей задачи. У меня в контейнерах могут быть только простые типы (изменил наименование темы).

 
 
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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