黃易群俠傳M脫機外掛應用程式黃易神行
2936
7

[分享] VB指針 (一)

wen0116 發表於 2009-3-24 14:36:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |
其實掌握VB指標技術,並不需要那麼痛苦。因為說穿了,也就那麼幾招,再勤加練習,

終可至神出鬼沒之境。廢話少說,讓我們先從指標的定義說起。

  一、指針是什麼?

  不需要去找什麼標準的定義,它就是一個32位元整數,在C語言和在VB堻ㄔi以用Long類型來表示。

32Windows平臺下它和普通的32位長整型數沒有什麼不同,只不過它的值是一個記憶體位址,

正是因為這個整數象針一樣指向一個記憶體位址,所以就有了指標的概念。



  有統計表明,很大一部分程式缺陷和記憶體的錯誤訪問有關。

正是因為指標直接和記憶體打交道,所以指標一直以來被看成一個危險的東西。

以至於不少語言,如著名的JAVA,都不提供對指標操作的支援,所有的記憶體訪問方面的處理都由編譯器來完成。

而象CC++,指針的使用則是基本功,指針給了程式師極大的自由去隨心所欲地處理記憶體訪問,

很多非常巧妙的東西都要依靠指標技術來完成。


  關於一門高級的程式設計語言是不是應該取消指標操作,關於沒有指標操作算不算一門語言的優點,

我在這堣ㄟ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

並告訴你什麼是可行的,什麼可行但必須要小心的,什麼是可能但不可行的,什麼是根本就不可能的。

收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


Goldenwolf 當前離線
UID
1166302
熱心
75 值
嘉獎
0 次
違規
0 次
在線時間
17 小時
經驗
75 點
積分
426
精華
0
最後登錄
2009-10-8
閱讀權限
25
註冊時間
2009-3-28
論壇幣
259 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
Goldenwolf 2009-4-1 10:35:31
你的意思是 自己動手做的東西 做出突破性的成品 就更刺激?感謝大大分享!!
回覆

使用道具 舉報

關小威 當前離線
UID
1167643
熱心
48 值
嘉獎
0 次
違規
0 次
在線時間
13 小時
經驗
47 點
積分
47
精華
0
最後登錄
2014-12-30
閱讀權限
20
註冊時間
2009-3-29
論壇幣
98 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
關小威 2009-4-19 17:14:17
雖然聽不是很懂
但還是感謝大大的分享
回覆

使用道具 舉報

may05005 當前離線
UID
1208553
熱心
42 值
嘉獎
0 次
違規
0 次
在線時間
15 小時
經驗
32 點
積分
146
精華
0
最後登錄
2018-8-6
閱讀權限
20
註冊時間
2009-5-7
論壇幣
50 幣
聯合幣
6 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
may05005 2009-5-12 16:19:03
雖然聽不是很懂
但還是感謝大大的分享
本文章轉自外掛聯合國http://www.wgun.net
回覆

使用道具 舉報

iiiiaaa 當前離線
UID
950079
熱心
89 值
嘉獎
0 次
違規
0 次
在線時間
22 小時
經驗
87 點
積分
198
精華
0
最後登錄
2015-11-14
閱讀權限
20
註冊時間
2008-7-24
論壇幣
211 幣
聯合幣
4 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
5
iiiiaaa 2009-5-15 21:46:26
推阿~~原來VB也可以做到低階程式做得到的事!!
回覆

使用道具 舉報

Trunone 當前離線
UID
915268
熱心
17 值
嘉獎
0 次
違規
0 次
在線時間
27 小時
經驗
13 點
積分
335
精華
0
最後登錄
2018-8-6
閱讀權限
25
註冊時間
2008-7-2
論壇幣
272 幣
聯合幣
6 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
6
Trunone 2009-7-1 01:20:00
原來在VB裡指標要這樣用啊!
回覆

使用道具 舉報

隨火 當前離線
UID
1294953
熱心
214 值
嘉獎
0 次
違規
0 次
在線時間
6 小時
經驗
14 點
積分
14
精華
0
最後登錄
2011-4-5
閱讀權限
10
註冊時間
2009-8-20
論壇幣
78 幣
聯合幣
0 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 1
7
隨火 2009-9-1 10:11:06
哦原來是這樣阿謝謝你無私的分享熱情的教學
回覆

使用道具 舉報

pkeasygod 當前離線
UID
536757
熱心
786 值
嘉獎
0 次
違規
0 次
在線時間
104 小時
經驗
771 點
積分
6793
精華
0
最後登錄
2018-8-5
閱讀權限
60
註冊時間
2007-9-7
論壇幣
5115 幣
聯合幣
13 枚
幸運鑽
0 顆
招待卷
75 點
查看詳細資料
Rank: 7Rank: 7Rank: 7
8
pkeasygod 2009-9-10 21:12:09
明白明白YCT14B
我現在追下去看(二)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊


手機版 | Archiver | 外掛聯合國

GMT+8, 2024-9-20 13:00 , Processed in 0.057090 second(s), 17 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?