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

Gre*_*edo 0 excel optimization vba types

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

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


本来我Integer表面上用的是as,它占用的内存更少。但我后来了解到事实并非如此,因为它会默默地转换为 Long

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

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

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

Pᴇʜ*_*Pᴇʜ 5

\n

最初我使用 Integer,因为从表面上看,它使用的内存较少。但我后来了解到事实并非如此,因为它会默默地转换为 Long

\n
\n\n

是的,由于这种转换,使用Integerover没有任何优势,但在与旧的 16 位 API 通信时可能是必要的。\n另请阅读“为什么使用整数而不是长整型?”LongInteger

\n\n
\n

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

\n
\n\n

您不会在Long或之间做出决定Double,因为其中一个使用较少的内存。您在它们之间做出决定,因为 \xe2\x80\xa6

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

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

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n
\n

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

\n
\n\n

不,那是错误的。布尔值是-1forTrue0for False。但请注意,如果您将例如 a 转换LongBooleannot 0那么它将自动转换并产生True

\n\n

Boolean在VBA中明确定义为:

\n\n
 0 = False\n-1 = True\n
Run Code Online (Sandbox Code Playgroud)\n