其實掌握VB指標技術,並不需要那麼痛苦。因為說穿了,也就那麼幾招,再勤加練習,
終可至神出鬼沒之境。廢話少說,讓我們先從指標的定義說起。
一、指針是什麼?
不需要去找什麼標準的定義,它就是一個32位元整數,在C語言和在VB堻ㄔi以用Long類型來表示。
在32位Windows平臺下它和普通的32位長整型數沒有什麼不同,只不過它的值是一個記憶體位址,
正是因為這個整數象針一樣指向一個記憶體位址,所以就有了指標的概念。
有統計表明,很大一部分程式缺陷和記憶體的錯誤訪問有關。
正是因為指標直接和記憶體打交道,所以指標一直以來被看成一個危險的東西。
以至於不少語言,如著名的JAVA,都不提供對指標操作的支援,所有的記憶體訪問方面的處理都由編譯器來完成。
而象C和C++,指針的使用則是基本功,指針給了程式師極大的自由去隨心所欲地處理記憶體訪問,
很多非常巧妙的東西都要依靠指標技術來完成。
關於一門高級的程式設計語言是不是應該取消指標操作,關於沒有指標操作算不算一門語言的優點,
我在這堣ㄟQ論,因為互聯網上關於這方面的沒有結果的討論,已經造成了佔用幾個GB的資源。
無論最終你是不是要下定決心修習指標技術《葵花寶典》,瞭解這門功夫總是有益處的。
注意:在VB堙A官方是不鼓勵使用什麼指針的,本文所講的任何東西你都別指望取得官方的技術支持,一切都要靠我們自己的努力,一切都更刺激!
讓我們開始神奇的VB指標探險吧!
二、來看看指針能做什麼?有什麼用?
先來看兩個程式,程式的功能都是交換兩個字串:
【程式一】:
'標準的做法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
你是不是以為第一個程式要快,因為它看著簡單而且不用調用API(調用API需要額外的處理,VB文檔明確指出大量調用API將降低程式性能)。
但事實上,在VB集成環境中運行,程式二要比程式一快四分之一;而編譯成本機代碼或p-code,程式二基本上要比程式一快一倍。
下面是兩個函數在編譯成本機代碼後,運行不同次數所花時間的比較:
運行100000次,SwapStr需要170毫秒,SwapPtr需要90毫秒。
運行200000次,SwapStr需要340毫秒,SwapPtr需要170毫秒。
運行2000000次,SwapStr需要3300毫秒,SwapPtr需要1500毫秒。
的確,調用API是需要額外指令來處理,但是由於使用了指標技術,它沒有進行臨時字串的分配和拷貝,因此速度提高了不少。
怎麼樣,想不到吧!C/C++程式師那麼依賴指標,無非也是因為使用指標往往能更直接的去處理問題的根源,更有駕馭一切的快感。
他們不是不知道使用指針的危險,他們不是不願意開衛星定位無級變速的汽車,只是騎摩托更有快感,而有些地方只有摩托才走得過去。
和在C媄似,在VB塈畯怢洏峆標也不過三個理由:
一是效率,這是一種態度一種追求,在VB堣]一樣;
二是不能不用,因為作業系統是C寫的,它時刻都在提醒我們它需要指標;
三是突破限制,VB想照料我們的一切,VB給了我們很強的類型檢查,VB象我們老媽一樣,對我們關心到有時我們會受不了,想偶爾不聽媽媽的話嗎?你需要指標!
但由於缺少官方的技術支援,在VB堙A指標變得很神秘。
因此在C堣@些基本的技術,在VB奡N變得比較困難。
本文的目的就是要提供給大家一種簡單的方法,來將C處理指標的技術拿到VB堥荂A
並告訴你什麼是可行的,什麼可行但必須要小心的,什麼是可能但不可行的,什麼是根本就不可能的。
|