Объем памяти 5 байтов QByteArray. Является ли quint64 или QByteArray размером 5 байт более эффективным для хранения?

Проверка размера QByteArray всегда возвращает 4 байта, я предполагаю из-за неявного совместного использования данных в Qt:

int n = 50; //or n = 100, 200
QByteArray arr(n,'a');
cout << sizeof(arr) << endl;
::getchar();

Всегда печатает 4

Как я могу оценить фактический объем памяти QByteArray? Вопрос мотивирован эффективным хранением большого количества 5-байтовых идентификаторов — они могут быть либо сохранены как quint64 (используя 8 байтов для каждого, поэтому 3 байта тратятся впустую), либо как каждый как QByteArray — но я не уверен, как оцените накладные расходы в последнем случае ….

Я хотел бы использовать эти идентификаторы в качестве ключа для QMap, поэтому каждый из них должен быть в своей собственной структуре — один длинный QByteArray не будет работать …

0

Решение

Фактические данные для QByteArray (в Qt 4.8) можно найти в qbytearray.h и выглядит так:

struct Data {
QBasicAtomicInt ref;
int alloc, size;
char *data;
char array[1];
};

Таким образом, quint64 будет использовать меньше памяти, если ваши данные поместятся в него.

1

Другие решения

sizeof (arr) показывает размер указателя объекта.
do arr.squeeze (); тогда arr.capacity ();

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

1

По вопросам рекламы [email protected]