让你知道VB.NET指针的作用

开发 后端
这里简单的分析一下VB.NET指针的操作,指针就是一个32位整数,在C语言和在VB里都可以用Long类型来表示,文章有详细的介绍,希望对大家有帮助。

在生活中我们所看到的指针是真实的,可是在我们的编程中所谓的指针是感念性的,抽象的,让人很难理解的。这里我们就详细的谈谈关于VB.NET指针问题。不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示。在32位Windows平台下它和普通的32位长整型数没有什么不同,只不过它的值是一个内存地址,正是因为这个整数象针一样指向一个内存地址,所以就有了指针的概念。

#T#有统计表明,很大一部分程序缺陷和内存的错误访问有关。正是因为指针直接和内存打交道,所以指针一直以来被看成一个危险的东西。以至于不少语言,如著名的JAVA,都不提供对指针操作的支持,所有的内存访问方面的处理都由编译器来完成。而象C和C++,指针的使用则是基本功,指针给了程序员极大的自由去随心所欲地处理内存访问,很多非常巧妙的东西都要依靠指针技术来完成。

关于一门高级的程序设计语言是不是应该取消指针操作,关于没有指针操作算不算一门语言的优点,我在这里不讨论,因为互联网上关于这方面的没有结果的讨论,已经造成了占用几个GB的资源。无论最终你是不是要下定决心修习指针技术《葵花宝典》,了解这门功夫总是有益处的。

注意:在VB里,官方是不鼓励使用什么指针的,本文所讲的任何东西你都别指望取得官方的技术支持,一切都要靠我们自己的努力,一切都更刺激!让我们开始神奇的VB指针探险吧!来看看VB.NET指针能做什么?有什么用?

先来看两个程序,程序的功能都是交换两个字串:

  1. '标准的做法SwapStr  
  2. Sub SwapStr(sA As String, sB As String)  
  3. Dim sTmp As String  
  4. sTmp = sAsA = sBsB = sTmp 
  5. End Sub 
  1. '用指针的做法SwapPtr  
  2. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
    (Destination As Any, Source As Any, ByVal Length As Long)Sub SwapPtr(sA As String, sB As String)  
  3. Dim lTmp As Long  
  4. CopyMemory lTmp, ByVal VarPtr(sA), 4  
  5. CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4  
  6. CopyMemory ByVal VarPtr(sB), lTmp, 4  
  7. End Sub 

你是不是以为***个程序要快,因为它看着简单而且不用调用API(调用API需要额外的处理,VB文档明确指出大量调用API将降低程序性能)。但事实上,在VB集成环境中运行,程序二要比程序一快四分之一;而编译成本机代码或p-code,程序二基本上要比程序一快一倍。下面是两个函数在编译成本机代码后,运行不同次数所花时间的比较:

  1. 运行100000次,SwapStr需要170毫秒,SwapPtr需要90毫秒。  
  2. 运行200000次,SwapStr需要340毫秒,SwapPtr需要170毫秒。  
  3. 运行2000000次,SwapStr需要3300毫秒,SwapPtr需要1500毫秒。 

的确,调用API是需要额外指令来处理,但是由于使用了VB.NET指针技术,它没有进行临时字串的分配和拷贝,因此速度提高了不少。

责任编辑:田树 来源: 博客
相关推荐

2009-11-03 10:09:48

VB.NET对象

2009-11-03 13:54:55

VB.NET继承

2010-01-14 10:35:34

VB.NET指针

2009-11-02 17:24:57

VB.NET语言

2010-01-21 17:34:48

VB.NET Bool

2009-10-14 15:20:21

VB.NET窗体指针

2009-11-03 17:47:07

VB.NET借助API

2009-11-02 16:05:51

VB.NET安装工程

2009-11-10 16:46:52

VB.NET指针应用

2009-12-24 14:30:56

VB.NET

2009-10-27 09:01:54

VB.NET内存指针

2009-10-29 15:50:49

VB.NET Exce

2009-11-02 10:42:04

VB.NET EXCE

2010-01-07 16:16:03

VB.NET变量作用域

2009-10-28 14:44:43

VB.NET Name

2009-10-30 13:48:36

VB.NET指针

2010-01-08 18:02:33

VB.NET事件

2010-01-14 13:27:33

VB.NET操作符li

2010-01-15 10:32:06

VB.NET继承

2010-01-21 16:30:58

VB.NET对象浏览器
点赞
收藏

51CTO技术栈公众号