【问题标题】:When writing on disk, should I use the smallest type possible?在磁盘上写入时,我应该使用尽可能小的类型吗?
【发布时间】:2017-03-04 09:14:59
【问题描述】:

在我的应用程序中,我必须在二进制文件上编写一些数据结构,其中很多都包含枚举。我应该将枚举转换为可能的最小类型(qint8)还是应该坚持使用 32 位(qint32)?

它会产生积极或消极的影响吗?我最关心的是速度而不是空间。

QDataStream& operator<<(QDataStream &out, const Event &event)
{
    out << (qint8)event.myEnum;
    //Also write other fields...
}

我看过一些建议反对这种优化的帖子(this 和this one),但它们是关于内存而不是磁盘写入的。

编辑:澄清:当使用QDataStream 时,我无法直接写入或读取enum,我必须将其转换为整数类型。我假设 8 位就足够了,因为在我的上下文中总是会有少于 127 个值(而且我也在使用 -1)。

【问题讨论】:

  • 您为什么认为qint8 足够大?说真的,让编译器决定底层类型。它知道自己在做什么。
  • 通常磁盘是块设备(例如 512 字节)。这意味着您在将数据写入磁盘之前首先缓存数据(顺便说一下,这是由 SO 完成的)。这样一来,有很多话要说。所以,我只提供一个论点:你通过内存间接管理这个文件,这意味着任何关于内存的建议都是有效的。当然,如果你需要写很多东西,事情可能会发生变化。最好的答案是分析它。
  • “8 位就足够了,因为 [...] 总是会有少于 127 个值” - 嗯...enum E { E_e = 256; }; 另外,符号扩展会导致输入数据损坏。
  • @IInspectable - 256 怎么小于 127?
  • @ddriver: 256 肯定不小于 127。但是,1 是,这是我示例中的值的数字。

标签: c++ qt enums


【解决方案1】:

使用最小的类型会有所帮助,因为您降低了流式数据速率,并且将花费更少的时间和精力(想想移动设备!)将其写出来。如果您的代码产生的数据比磁盘消耗的慢,那么如果您使用较大的类型,wall time 不会改变,但是您选择的较大的数据类型会消耗更多的能量。

总体而言,我更担心您的序列化是否能经得起未来的考验 - 确保您的文件版本处于适当的级别(例如,整个文件的一个版本,或每个小节的版本,甚至每个结构的版本- 取决于代码的结构和意义)。

【讨论】:

    【解决方案2】:

    如果你只需要一个字节,那么就使用一个字节。 QDataStream 当然可以在字节分辨率上工作。这没有任何缺点,如果您序列化大量这些对象,您将看到实实在在的好处。

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多