VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 36910|回复: 92

这样来用Dim真的能节省内存吗?

  [复制链接]
 楼主| 发表于 2006-7-8 10:02:50 | 显示全部楼层 |阅读模式
经常看到有些高手写的程序是这样的:
If ... Then
  dim a as byte
  ...
Else
...
End If
意思就是如果某条件成立,才给a分配内存。
我觉得这样做好别扭啊,我习惯于把所有的dim语句全部堆在子程序的开头。
我觉得一进入子程序,系统就应该为本子程序的所有变量分配内存。
到底是我对还是他们对呢?茫然中......

点评

我要挖一个坟,我的山寨Basic编译器也不支持代码块级别的变量作用域,主要是这样写编译器又要加一堆代码,而且生成的代码竟然要调用alloca函数,好像M$VC运行库没有导出……  发表于 2011-11-8 13:57

本帖被以下淘专辑推荐:

发表于 2006-7-8 10:16:36 | 显示全部楼层
我也想知道
回复 支持 反对

使用道具 举报

发表于 2006-7-8 11:34:58 | 显示全部楼层
这个问题表面看很明显,但是最好做个试验……
给个代码:
If True Then
    Dim A As Integer
    A = 10
End If
Debug.Print A
最后程序运行结果为10,证明不会因为变量被定义在If块内而省内存。
那么再来探讨一下,不进入If块能否引发变量声明……哦,这个看起来答案很明显,但真的是这样么??
看下面的代码:
Option Explicit
Private Sub Form_Load()
If False Then
    Dim A As Integer
    A = 10
End If
Debug.Print A
End Sub
极为神奇的事情发生了!!程序没有报告变量未声明的错误,但立即窗口中打出了0!!显然,程序虽没有执行A = 10,但的确执行了Dim A As Integer!很不可思议,但的确发生了!可见,以上方法其实是不能节省内存的……
回复 支持 反对

使用道具 举报

发表于 2006-7-8 11:36:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2006-7-8 14:18:12 | 显示全部楼层
明白了!
回复 支持 反对

使用道具 举报

发表于 2006-7-8 20:23:24 | 显示全部楼层
dim 常用来声明临时变量,象楼主所说的情况,大概是想和 private public比,答案是肯定的,dim 更省内存
至于在哪里声明更好,我推荐在过程(是过程,不是模块啊)的最顶端,用dim 声明
CrCat  的事情我也发现过,
if ... then
...
else
...
end if
结果造成象 iif 的效果一样,if 也同时对 两个判断式进行了运算
回复 支持 反对

使用道具 举报

发表于 2006-7-8 22:34:50 | 显示全部楼层
在6.0 的MSDN中我的确找不到这个问题的答案,最多只能找到这样一句
“ 注意 当在过程中使用 Dim 语句时,通常将 Dim 语句放在过程的开始处。 ” (私下怀疑是微软故意回避这个问题)

最后终于在“从 Visual Basic 6.0 升级到 Visual Basic.NET 的白皮书”中找到这个问题的答案。(一直到升级的时候才承认缺陷,似乎是个不错的主意)

(以下载自白皮书)

块内的局部变量
Visual Basic 6.0
从包含声明的行至过程结束的范围内,局部变量均可见。

Visual Basic.NET
Visual Basic.NET 支持变量的块范围。这意味着从包含声明的行开始,至出现声明的块结束,局部变量均可见。例如:

Sub Test(x As Integer)  
If x < 0 Then  
  Dim y As Integer = - x  
  '...  
Else  
  '...  
End If
End Sub
以上示例中的变量 y 仅在声明该变量的块中可用;更确切地说,它仅在其声明至 Else 语句之间可用。如果需要在整个过程中使用变量,则必须在 If/Else/End If 控制结构之外声明该变量。

变量的块范围是许多结构语言共有的功能。过程局部变量允许定义过程内部变量,从而对结构化编程提供支持,与此类似,块级别变量允许定义代码块内部变量,从而对结构化分解提供支持。



升级
向导


如果变量在块内声明,变量将自动移至模块级范围。例如,以下代码:

If x =1 Then
    Dim y As Integer  
End If升级后将变为:

Dim y As Integer
If x =1 Then
End If

[ 本帖最后由 yimins 于 2006-7-8 22:37 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-9 23:41:53 | 显示全部楼层
原帖由 CrCat 于 2006-7-8 11:34 发表
这个问题表面看很明显,但是最好做个试验……
给个代码:
If True Then
    Dim A As Integer
    A = 10
End If
Debug.Print A
最后程序运行结果为10,证明不会因为变量被定义在If块内而省内存。
那么再 ...

好贴,精彩!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-9 23:52:05 | 显示全部楼层
原帖由 yimins 于 2006-7-8 22:34 发表
在6.0 的MSDN中我的确找不到这个问题的答案,最多只能找到这样一句
“ 注意 当在过程中使用 Dim 语句时,通常将 Dim 语句放在过程的开始处。 ” (私下怀疑是微软故意回避这个问题)

最后终于在“从 Visual B ...

亦好贴!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-9 23:54:28 | 显示全部楼层
原帖由 PctGL 于 2006-7-8 20:23 发表
dim 常用来声明临时变量,象楼主所说的情况,大概是想和 private public比,答案是肯定的,dim 更省内存
至于在哪里声明更好,我推荐在过程(是过程,不是模块啊)的最顶端,用dim 声明
CrCat  的事情我也发现过 ...

我不是想和 private public比,是dim放在if外和if语句内比
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-2 12:27

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表