讓你知道VB.NET指針的作用
在生活中我們所看到的指針是真實的,可是在我們的編程中所謂的指針是感念性的,抽象的,讓人很難理解的。這里我們就詳細的談?wù)勱P(guān)于VB.NET指針問題。不需要去找什么標準的定義,它就是一個32位整數(shù),在C語言和在VB里都可以用Long類型來表示。在32位Windows平臺下它和普通的32位長整型數(shù)沒有什么不同,只不過它的值是一個內(nèi)存地址,正是因為這個整數(shù)象針一樣指向一個內(nèi)存地址,所以就有了指針的概念。
#T#有統(tǒng)計表明,很大一部分程序缺陷和內(nèi)存的錯誤訪問有關(guān)。正是因為指針直接和內(nèi)存打交道,所以指針一直以來被看成一個危險的東西。以至于不少語言,如著名的JAVA,都不提供對指針操作的支持,所有的內(nèi)存訪問方面的處理都由編譯器來完成。而象C和C++,指針的使用則是基本功,指針給了程序員極大的自由去隨心所欲地處理內(nèi)存訪問,很多非常巧妙的東西都要依靠指針技術(shù)來完成。
關(guān)于一門高級的程序設(shè)計語言是不是應(yīng)該取消指針操作,關(guān)于沒有指針操作算不算一門語言的優(yōu)點,我在這里不討論,因為互聯(lián)網(wǎng)上關(guān)于這方面的沒有結(jié)果的討論,已經(jīng)造成了占用幾個GB的資源。無論最終你是不是要下定決心修習指針技術(shù)《葵花寶典》,了解這門功夫總是有益處的。
注意:在VB里,官方是不鼓勵使用什么指針的,本文所講的任何東西你都別指望取得官方的技術(shù)支持,一切都要靠我們自己的努力,一切都更刺激!讓我們開始神奇的VB指針探險吧!來看看VB.NET指針能做什么?有什么用?
先來看兩個程序,程序的功能都是交換兩個字串:
- '標準的做法SwapStr
- Sub SwapStr(sA As String, sB As String)
- Dim sTmp As String
- sTmp = sA: sA = sB: sB = sTmp
- End Sub
- '用指針的做法SwapPtr
- 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)- Dim lTmp As Long
- CopyMemory lTmp, ByVal VarPtr(sA), 4
- CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
- CopyMemory ByVal VarPtr(sB), lTmp, 4
- End Sub
你是不是以為***個程序要快,因為它看著簡單而且不用調(diào)用API(調(diào)用API需要額外的處理,VB文檔明確指出大量調(diào)用API將降低程序性能)。但事實上,在VB集成環(huán)境中運行,程序二要比程序一快四分之一;而編譯成本機代碼或p-code,程序二基本上要比程序一快一倍。下面是兩個函數(shù)在編譯成本機代碼后,運行不同次數(shù)所花時間的比較:
- 運行100000次,SwapStr需要170毫秒,SwapPtr需要90毫秒。
- 運行200000次,SwapStr需要340毫秒,SwapPtr需要170毫秒。
- 運行2000000次,SwapStr需要3300毫秒,SwapPtr需要1500毫秒。
的確,調(diào)用API是需要額外指令來處理,但是由于使用了VB.NET指針技術(shù),它沒有進行臨時字串的分配和拷貝,因此速度提高了不少。