【问题标题】:Memory footprint of 5 byte QByteArray. Is quint64 or QByteArray of 5 bytes more efficient for storage?5 字节 QByteArray 的内存占用。 5 字节的 quint64 或 QByteArray 存储效率更高吗?
【发布时间】:2013-07-14 16:22:34
【问题描述】:

检查 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 不起作用...

【问题讨论】:

  • 如果你想有效地存储这 5 个字节,那么普通的旧结构怎么样?
  • @Roku 以及如何将它们存储为 POD - 包含带有比较运算符的 char[5] 的结构?
  • 也许使用结构体不是一个好主意,至少使用 QByteArray 更容易。顺便说一句,你有多少个 5 字节标识符?超过 200 个?
  • @Roku 是的,有数千个 - 每个文件 1000 到 4000 个,目标是一次处理尽可能多的文件(最多 800-900 个文件)。为什么,200 有什么特别之处?
  • 哦,200 没什么特别的,它只是从你的代码中出来的。我认为标识符的数量并不多。如果您使用 quint64,您将浪费 900*4000*3=11 兆字节的内存。除非您的程序已经在使用千兆字节的内存(并且某些 32 位操作系统存在问题),否则我不会担心浪费的内存量。相反,我会选择最容易实现和维护的方法。

标签: c++ qt qbytearray


【解决方案1】:

QByteArray(在 Qt 4.8 中)的实际数据可以在 qbytearray.h 中找到,如下所示:

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

因此,如果您的数据适合其中,quint64 将使用更少的存储空间。

【讨论】:

    【解决方案2】:

    sizeof(arr) 显示对象的指针大小。 做 arr.squeeze();然后 arr.capacity();

    但不要继续对最终代码进行挤压调用,它所做的是摆脱对象预先分配的任何未使用内存,因此它会重新分配和 memcopies(昂贵)。

    【讨论】:

    • 是的,那我怎么估计实际尺寸呢?
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2016-07-07
    • 2014-04-25
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多