您在注释中说过,您正在使用另外四个in作为键--这些值也必须保存,因此您实际上要存储8个in,而不是4个。除此之外,QHash还必须存储哈希值,以便根据键高效地查找值。哈希是一个无符号整数,因此您有9个值,每个值有4个字节长。其总价值为350 MB。
此外,内部QHash或QMap可以在其元素之间使用一些填充,例如满足数据结构对齐要求。填充是一个1字节的乘法器,这意味着在10百万元素的情况下,我们至少可以得到--至少有几十个兆字节的。
此外,QHash和QMap不仅仅是原始数据--它们都使用指向内部数据结构等的额外指针,这也是单个条目占用空间比您预期的要多的另一个原因。
数据大小膨胀的另一个原因可能是,出于效率原因,这些类可能存储一些附加值,以便在调用它们的某些方法时预先计算它们。
最后但并非最不重要的一点是,QHash由于效率原因(避免不必要的复制)在任何给定时刻都保留了比当前元素更多的内存。我预计,越大的大小,它就会保留更多的内存,以防万一,因为复制变得更昂贵。您可以通过调用()方法来检查预先预留的内存。如果您想限制保留的内存量,请调用挤压()方法来裁剪内存量,这样它就足够包含当前存储的元素了。