【问题标题】:Least memory intensive way of storing small integers in VBA在 VBA 中存储小整数的最小内存占用方式
【发布时间】:2017-09-03 09:30:14
【问题描述】:

有时我会将某些系统的状态存储为整数。我经常发现自己对这些状态使用较小的值(比如 1-10),因为系统相对简单。

一般来说,存储小的正整数的变量的最佳声明是什么 - 其中 best 被定义为最快的读/写时间和最小的内存消耗? Small 在这里定义为 1-10,尽管整数存储方法及其范围的完整列表会很有用。


最初我使用Integer,因为它使用较少的内存。但后来我了解到情况并非如此,因为它被默默地转换为 Long

然后我出于上述原因使用了Long,并且知道它使用的内存少于Double

我后来发现Byte 并切换到它,因为它存储较小的整数(0-255 或 256,我不记得是哪个),而且我猜它的分钟名称使用更少的内存。但我不太信任 VBA,我想知道这里是否也完成了任何内部类型转换。

Boolean我以为只有0或1,但我读到任何非零数字都被转换为True,这是否意味着它也可以存储数字?

【问题讨论】:

  • 在您拥有至少 1GB 的内存可供使用的情况下,为什么还要关心 Byte 和 Long 之间的区别? MS 显然认为使用 Long 的好处大于使用 Integer 所隐含的节省。当您开始使用以该货币存储的值时,字节会转换成什么?
  • Integer Vs Long Confusion可能部分重复
  • 您是否考虑过使用枚举而不是普通整数?在设计方面,易于阅读的枚举可能比将状态人工编码为数字或字节更合适。

标签: vba excel optimization types


【解决方案1】:

最初我使用整数,因为它使用较少的内存。但后来我了解到情况并非如此,因为它被默默地转换为 Long

没错,由于这种转换,使用Integer 比使用Long 没有任何优势,但在与旧的16 位API 通信时可能需要Integer
另请阅读"Why Use Integer Instead of Long?"

然后我出于上述原因使用了Long,并且知道它使用的内存少于Double

您不会在LongDouble 之间做出选择,因为使用的内存更少。你在他们之间做出决定是因为……

  • 您需要浮点数 (Double)
  • 或者您不接受浮点数。 (Long)

在这种特定情况下决定内存使用情况只是一个非常糟糕的主意,因为这些类型根本不同。

我后来发现 Byte 并切换到它,因为它存储更小的整数(0-255 或 256,我不记得是哪个),而且我猜它使用分钟名称的内存更少。但我不太信任 VBA,想知道这里是否也进行了任何内部类型转换。

我没有看到您使用 Office/Excel 并通过使用 Long 而不是 Byte 从 1 迭代到 10 来遇到任何内存问题的情况。如果您需要将其限制为 255(一些旧API,无论如何)然后你可以使用Byte。如果不需要,我会使用 Long 只是为了灵活且不会遇到任何编码问题,因为您需要记住哪些计数器仅是 Byte,哪些是 Long
例如。如果我使用i 进行迭代,我会期望Long。我认为在这种情况下使用Byte 没有任何优势。

尽可能简单。不要仅仅因为你能做到,就去做一些你不会想到的奇怪的事情。避免未来的编码问题比一(或三)字节的内存使用更有价值。有时,编写良好的人类可读和可维护的代码比编写更快的代码更有价值,尤其是在您无法注意到差异的情况下(在这种情况下您确实无法注意到)。可读性差的代码迟早总会导致错误或漏洞。

Boolean 我以为只有 0 或 1,但我读过任何非零数字都被转换为 True,这是否意味着它也可以存储数字?

不,那是错误的。对于 True,布尔值是 -1,对于 False,布尔值是 0。但请注意,如果您投射例如将Long 转换为Boolean,这是not 0,然后它将自动转换并导致True

但是VBA中的Boolean明确定义为:

 0 = False
-1 = True

【讨论】:

    【解决方案2】:

    可寻址的最小内存块是一个字节(8 位)。

    我不能保证 VBA 字节在所有情况下都存储为字节,但使用这种类型是最安全的。

    顺便说一下,最大的字节值是11111111b,即255d。 256d 的值是 100000000b,需要 9 位。


    另请注意,如果需要进行数值转换,每次都使用 Bytes 可能没有效率,因为它可能会在运行时间方面产生成本,而空闲的内存空间可能微不足道。

    除了非常特殊的应用,这种微优化是没有用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2010-10-15
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多