Вы сказали в комментарии, что используете еще четыре целых числа в качестве ключа - эти значения также должны быть сохранены, поэтому вы фактически сохраняете 8 целых чисел, а не 4. Кроме того, QHash должен хранить значение хэша для эффективно искать значения на основе ключа. Хэш представляет собой целое число без знака, поэтому у вас есть 9 значений, каждое из которых имеет длину 4 байта. В сумме получается ~350 МБ.
Кроме того, внутренне QHash или QMap могут использовать некоторые отступы между своими элементами, например, для удовлетворения требования к выравниванию структуры данных. Заполнение — это множитель 1 байта, а это значит, что при 10 млн элементов мы можем получить минимум несколько десятков дополнительных мегабайт.
Кроме того, QHash и QMap — это не просто необработанные данные — они оба используют дополнительные указатели на свои внутренние структуры данных и т. д., что является еще одной причиной, по которой одна запись займет больше времени. пространство, чем вы ожидали.
Еще одним источником увеличения размера данных может быть тот факт, что по соображениям эффективности эти классы могут хранить некоторые дополнительные значения, чтобы они предварительно вычислялись при вызове некоторых из их методов.
И последнее, но не менее важное: QHash резервирует больше памяти, чем требуется его текущим элементам в любой момент по соображениям эффективности (избегая ненужного копирования). Я ожидаю, что чем больше размер, тем больше памяти он будет резервировать на всякий случай, потому что копирование становится дороже. Вы можете заранее проверить зарезервированную память, вызвав метод capacity(). Если вы хотите ограничить объем зарезервированной памяти, вызовите метод squeeze(), чтобы настроить объем памяти таким образом, чтобы ее было достаточно для хранения текущих сохраненных элементов.
person
KjMag
schedule
17.05.2017
QHash
иQMap
являются ассоциативными контейнерами: если предположить, что ваша структура из 4-х целых чисел является хранимым значением, каков тип ключей? - person rgmt   schedule 17.05.2017