Russian Qt Forum

Qt => Общие вопросы => Тема начата: kuzulis от Июль 04, 2014, 11:56



Название: Re: [Решено]Красиво узнать размер Qt-контейнера (с простыми типами) в байтах
Отправлено: kuzulis от Июль 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
        ]


Есть ли возможность как-то красиво это реализовать? :)


Название: Re: Красиво узнать размер Qt-контейнера в байтах
Отправлено: Igors от Июль 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 +... // может чего-о упустил

Есть ли возможность как-то красиво это реализовать? :)
К сожалению - нет


Название: Re: Красиво узнать размер Qt-контейнера в байтах
Отправлено: alex312 от Июль 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);
}


Название: Re: Красиво узнать размер Qt-контейнера в байтах
Отправлено: kambala от Июль 04, 2014, 12:39
Q_UNUSED уж лучше тогда


Название: Re: Красиво узнать размер Qt-контейнера в байтах
Отправлено: kuzulis от Июль 04, 2014, 13:28
Цитата: alex312
И еще, а зачем обьявлять переменную, если sizeof можно применять и к типу.

Ах, спасибо.. :)

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

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


Название: Re: [Решено]Красиво узнать размер Qt-контейнера в байтах
Отправлено: m_ax от Июль 04, 2014, 14:13
Цитировать
Это понятно. Имелся ввиду размер используемых элементов в байтах.  :)

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


Название: Re: [Решено]Красиво узнать размер Qt-контейнера (с простыми типами) в байтах
Отправлено: kuzulis от Июль 04, 2014, 14:30
Эмм.. таки да.  ::)

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