【问题标题】:something between int and float to reserve less memory than with float?在 int 和 float 之间保留比 float 更少的内存?
【发布时间】:2013-11-15 15:44:53
【问题描述】:

我需要保存在(malloc)内存(ram)具有下一个形式的数据:

34566,5
45,5
46,67
32
-4
58
-43,5
etc

我的意思是,逗号后面的数据永远不会超过 2 位。 不知何故,我可以在不使用浮点类型的情况下保留内存? 提前致谢。

【问题讨论】:

  • 确定如果您永远不需要超过 +/- 2^31/100,那么只需使用 int 并知道最后 2 个十进制数字隐含在小数点后...注意乘法和除法这将移动它。
  • 在典型情况下,浮点数与int 的大小完全相同(大多数情况下均为 32 位)。您可以使用缩放的 int(即存储原始数字乘以 100),但是否值得在很大程度上取决于您需要对它们做什么。
  • 您想要实现的目标也非常重要。这些数字(以及它们的算术)是否需要 100% 精确?它们需要很大吗?
  • 存储它们后,您需要什么样的访问权限?如果您不需要恒定时间随机访问,则有很多可用的压缩选项。

标签: c++ c memory-management malloc


【解决方案1】:

取决于逗号前的位数。如果您知道可能值的总数 N,那么您将需要上限 (log2 N) 位值才能表示所有值。从中,您可以找出适合的最小类型。

【讨论】:

    【解决方案2】:

    如果您真的关心内存并且能够指定存储单个值所需的确切位数,您可以决定是使用内置类型还是创建自己的类型。我的意思是,例如,如果您需要 6 位来存储单个值,则可以制作容器,该容器将使用 3 个字节(3x 字符)存储每 4 个值。这样的容器必须使用位运算符来访问值。

    【讨论】:

      【解决方案3】:

      看起来 16 位整数是不够的,所以下一个常用的数据类型是 32 位整数或浮点数,这意味着在这种情况下可能没有可以节省内存的本机数据类型。您可以想出一个使用较少位的自定义定点类型(例如,24 位可能是最简单的;您可以将乘以 100 的数字存储在三个字节的整数中),但总的来说,我建议看看方法即时压缩整个数据集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2011-10-11
        • 2011-07-17
        • 1970-01-01
        • 2017-02-03
        • 2011-09-27
        • 2014-08-17
        相关资源
        最近更新 更多