在VBA中存储小整数的最小内存密集方式

时间:2017-09-03 09:30:14

标签: vba excel-vba optimization types excel

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

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

最初我使用Integer就像它一样,它使用更少的内存。但我已经知道情况并非如此,因为它被默默地转换为Long

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

我已经发现Byte并切换到那个,因为它存储了较小的整数(0-255或256,我永远不记得哪个),并且我想从它的分钟名称中使用更少的内存。但我真的不相信VBA,并想知道这里是否有任何内部类型转换。

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

2 个答案:

答案 0 :(得分:4)

  

最初我使用Integer作为它的表面,它使用更少的内存。但我已经知道情况并非如此,因为它被默默地转换为Long

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

  

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

您不会在DoubleLong之间做出决定,因为使用的内存较少。你决定他们之间是因为......

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

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

  

我已经发现Byte并切换到那个,因为它存储了较小的整数(0-255或256,我永远不记得哪个),我猜它使用较少的内存来自它的分钟名称。但我并不真正信任VBA,并想知道这里是否有任何内部类型转换。

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

尽可能保持简单。不要只做因为你能做到的奇怪事情。避免未来的编码问题值得超过一(或三)个字节的内存使用量。有时候编写好的人类可读和可维护代码比编写更快的代码更有价值,特别是如果你不能注意到这些差异(在这种情况下你真的可以做到)。糟糕的可读代码迟早会导致错误或漏洞。

  

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

没错。 Byte的布尔值为-1True的布尔值为0。但请注意,如果你施放,例如False进入Long Boolean然后它会自动投射并生成0

但VBA中的True明确定义为:

Boolean

答案 1 :(得分:3)

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

我无法保证在所有情况下都将VBA字节存储为字节,但使用此类型是最安全的。

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

另请注意,在每个可能的时间使用字节可能是徒劳的,因为如果需要进行数字转换,它可能会在运行时间方面产生成本,而备用内存空间可能无关紧要。

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