VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: VBProFan

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

  [复制链接]
头像被屏蔽
发表于 2013-4-5 01:05:30 | 显示全部楼层
看汇编就知道,vb在开始进入函数的时候就已近在堆栈中搞好了局部变量

比较以下代码,
  1. Private Sub cmdCommand1_Click()
  2.     Dim a As Long
  3.     a = 1
  4. End Sub

  5. Private Sub cmdCommand2_Click()
  6.     If False Then
  7.         Dim a As Long
  8.     End If
  9. End Sub
复制代码
编译od打开,
你会看到两个过程代码如下:
  1. 00401A60 工程1.Form1::cmdCommand1_Click                 /> \55            push    ebp
  2. 00401A61                                              |.  8BEC          mov     ebp, esp
  3. 00401A63                                              |.  83EC 0C       sub     esp, 0C
  4. 00401A66                                              |.  68 B6104000   push    __vbaExceptHandler               ;  jmp 到 msvbvm60.__vbaExceptHandler; SE 处理程序安装
  5. 00401A6B                                              |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
  6. 00401A71                                              |.  50            push    eax
  7. 00401A72                                              |.  64:8925 00000>mov     dword ptr fs:[0], esp
  8. 00401A79                                              |.  83EC 0C       sub     esp, 0C
  9. 00401A7C                                              |.  53            push    ebx
  10. 00401A7D                                              |.  56            push    esi
  11. 00401A7E                                              |.  57            push    edi
  12. 00401A7F                                              |.  8965 F4       mov     dword ptr [ebp-C], esp
  13. 00401A82                                              |.  C745 F8 A0104>mov     dword ptr [ebp-8], 004010A0
  14. 00401A89                                              |.  8B45 08       mov     eax, dword ptr [ebp+8]
  15. 00401A8C                                              |.  8BC8          mov     ecx, eax
  16. 00401A8E                                              |.  83E1 01       and     ecx, 1
  17. 00401A91                                              |.  894D FC       mov     dword ptr [ebp-4], ecx
  18. 00401A94                                              |.  24 FE         and     al, 0FE
  19. 00401A96                                              |.  50            push    eax
  20. 00401A97                                              |.  8945 08       mov     dword ptr [ebp+8], eax
  21. 00401A9A                                              |.  8B10          mov     edx, dword ptr [eax]
  22. 00401A9C                                              |.  FF52 04       call    dword ptr [edx+4]                ;  msvbvm60.Zombie_AddRef
  23. 00401A9F                                              |.  C745 FC 00000>mov     dword ptr [ebp-4], 0
  24. 00401AA6                                              |.  8B45 08       mov     eax, dword ptr [ebp+8]
  25. 00401AA9                                              |.  50            push    eax
  26. 00401AAA                                              |.  8B08          mov     ecx, dword ptr [eax]
  27. 00401AAC                                              |.  FF51 08       call    dword ptr [ecx+8]
  28. 00401AAF                                              |.  8B45 FC       mov     eax, dword ptr [ebp-4]
  29. 00401AB2                                              |.  8B4D EC       mov     ecx, dword ptr [ebp-14]
  30. 00401AB5                                              |.  5F            pop     edi
  31. 00401AB6                                              |.  5E            pop     esi
  32. 00401AB7                                              |.  64:890D 00000>mov     dword ptr fs:[0], ecx
  33. 00401ABE                                              |.  5B            pop     ebx
  34. 00401ABF                                              |.  8BE5          mov     esp, ebp
  35. 00401AC1                                              |.  5D            pop     ebp
  36. 00401AC2                                              \.  C2 0400       retn    4
复制代码
  1. 00401AD0 工程1.Form1::cmdCommand2_Click                 /> \55            push    ebp
  2. 00401AD1                                              |.  8BEC          mov     ebp, esp
  3. 00401AD3                                              |.  83EC 0C       sub     esp, 0C
  4. 00401AD6                                              |.  68 B6104000   push    __vbaExceptHandler               ;  jmp 到 msvbvm60.__vbaExceptHandler; SE 处理程序安装
  5. 00401ADB                                              |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
  6. 00401AE1                                              |.  50            push    eax
  7. 00401AE2                                              |.  64:8925 00000>mov     dword ptr fs:[0], esp
  8. 00401AE9                                              |.  83EC 0C       sub     esp, 0C
  9. 00401AEC                                              |.  53            push    ebx
  10. 00401AED                                              |.  56            push    esi
  11. 00401AEE                                              |.  57            push    edi
  12. 00401AEF                                              |.  8965 F4       mov     dword ptr [ebp-C], esp
  13. 00401AF2                                              |.  C745 F8 A8104>mov     dword ptr [ebp-8], 004010A8
  14. 00401AF9                                              |.  8B45 08       mov     eax, dword ptr [ebp+8]
  15. 00401AFC                                              |.  8BC8          mov     ecx, eax
  16. 00401AFE                                              |.  83E1 01       and     ecx, 1
  17. 00401B01                                              |.  894D FC       mov     dword ptr [ebp-4], ecx
  18. 00401B04                                              |.  24 FE         and     al, 0FE
  19. 00401B06                                              |.  50            push    eax
  20. 00401B07                                              |.  8945 08       mov     dword ptr [ebp+8], eax
  21. 00401B0A                                              |.  8B10          mov     edx, dword ptr [eax]
  22. 00401B0C                                              |.  FF52 04       call    dword ptr [edx+4]
  23. 00401B0F                                              |.  C745 FC 00000>mov     dword ptr [ebp-4], 0
  24. 00401B16                                              |.  8B45 08       mov     eax, dword ptr [ebp+8]
  25. 00401B19                                              |.  50            push    eax
  26. 00401B1A                                              |.  8B08          mov     ecx, dword ptr [eax]
  27. 00401B1C                                              |.  FF51 08       call    dword ptr [ecx+8]
  28. 00401B1F                                              |.  8B45 FC       mov     eax, dword ptr [ebp-4]
  29. 00401B22                                              |.  8B4D EC       mov     ecx, dword ptr [ebp-14]
  30. 00401B25                                              |.  5F            pop     edi
  31. 00401B26                                              |.  5E            pop     esi
  32. 00401B27                                              |.  64:890D 00000>mov     dword ptr fs:[0], ecx
  33. 00401B2E                                              |.  5B            pop     ebx
  34. 00401B2F                                              |.  8BE5          mov     esp, ebp
  35. 00401B31                                              |.  5D            pop     ebp
  36. 00401B32                                              \.  C2 0400       retn    4
复制代码
结论:vb和C的If变量管理不一样。

评分

参与人数 1威望 +5 人气 +3 收起 理由
acme_pjz + 5 + 3 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2015-11-21 12:21:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-12-6 14:24:28 | 显示全部楼层
CrCat 发表于 2006-7-8 11:34
这个问题表面看很明显,但是最好做个试验……
给个代码:
If True Then

你要知道,VB对于未声明的变量是会已Variant为类型自动分配变量内存的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-6-29 02:00

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