当我第一次创建数组时,我知道最好设置数据类型,因为默认的Variant
类型很慢,在VBA中最好避免使用
我注意到了
Redim t(1 To 10) As String
似乎与
具有相同的效果Dim t() As String
Redim t(1 To 10)
但我想知道;第一个选项首先将t()
转换为Variant
,然后转换为String
,浪费内存并进行双重写入?
或者由于2行,第二个选项实际上更慢。当我Dim
数组没有指定其大小时,内存中实际发生了什么?
当然
Dim t(1 To 10) As String
是最有效率的,但我后来需要Redim Preserve
,所以不能这样做。
答案 0 :(得分:4)
当我
Dim
数组而未指定其大小时,内存中实际发生了什么?
你得到一个未初始化的动态大小的数组:VBA"预留一个地点"在记忆中。究竟如何工作是内部管道,只有微软有答案 - 除非你可以逆向工程P代码(假设你可以首先提取编译的P代码)。
Dim
和ReDim
都可以充当声明性陈述 - 并不代表应该 - 来自{{3} (强调我的):
如果声明的变量在模块级别或过程级别不存在,则ReDim语句充当声明性语句。如果稍后创建具有相同名称的另一个变量,即使在更宽的范围内,ReDim也会引用后面的变量,并且即使Option Explicit有效,也不会导致编译错误。为了避免这种冲突, ReDim不应该用作声明性语句,而只是用于重新定义数组。
当你说:
或者第二个选项因为2行而实际上更慢。
您忘记了Dim
不是可执行语句(您不能在Dim
语句中中断)。 ReDim
是。所以两个"选项"就运行时而言基本相同,除了第一个(使用ReDim
作为声明性语句)是针对最佳实践的。
因此,如果需要动态数组,请使用Dim
:
Dim foo() As String
然后当您需要调整大小时,请使用ReDim
执行此操作:
ReDim foo(1 To bar)
根据经验,你不应该担心Dim
是否比ReDim
更有效,或者反过来是否相反 - 那就是' sa 99.9999999997%如果您的代码存在性能问题,则问题在于您的算法,而不是VBA如何实现变量和数组分配。