程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB“變態”用法之高效字串指針類

VB“變態”用法之高效字串指針類

編輯:VB綜合教程
使用VB裡的字串類型String有兩大不足:第一、它的分配是由VB運行時控制,我們不能將其分配在指定內存處;第二,任何一次對字串的賦值操作都要進行內存重新分配。要實現高效、靈活的字串處理,我們必須克服這兩大不足。

  對於第一個問題,通過修改String變量裡放著的BSTR描述符指針可以實現;對於第二個問題,可以用Mid語句(注意是語句而不是函數)來賦值。不詳細講了,直接看下面的這個類:
  

  OptionExplicit

  

  '********************************************************

  'clsBSTR.cls

  '作者:熊超ID:AdamBear2002年3月18日

  'http://www.csdn.net/Author/AdamBear

  '你可以自由使用本類模塊,不過請保留本聲明

  '********************************************************

  

  PrivateDeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(DestinationAsAny,SourceAsAny,ByValLengthAsLong)

  

  '不要直接對sString賦值(可以用MID語句),將其設為公有僅為提高效率。

  PublicsStringAsString'BSTR描述符指針

  

  PrivatepStrAsLong'BSTR地址

  PrivatenMaxLenAsLong'BSTR最大字節數

  
  '讓本字串指向特定地址

  PublicSubAttach(AddrAsLong,OptionalnLenAsLong)

  pStr=Addr

  '修改BSTR描述符指針,使其指向Addr

  CopyMemoryByValVarPtr(sString),Addr,4

  

  IfIsMissing(nLen)ThenExitSub

  '設定最大字串字節數

  nMaxLen=nLen

  

  EndSub

  

  '還原本字串原BSTR描述符

  PublicSubDetach()

   CopyMemoryByValVarPtr(sString),0&,4

  EndSub

  

  '讓本字串指向源字串

  PublicSubAttachStr(sStrAsString)

   AttachStrPtr(sStr),LenB(sStr)

  EndSub

  

  'data為缺省屬性

  PublicPropertyLetdata(sValAsString)

   DimcAsLong

   c=LenB(sVal)

   '超過最大字串數,拋出錯誤。

   Ifc>nMaxLenThenErr.RaisevbObjectError 3000,"CString::LetData","溢出"

   '寫字串長度

   CopyMemoryByVal(pStr-4),c,4

   '寫字串

   Mid(sString,1)=sVal

  EndProperty

  

  '可以通過公有變量sString來讀字串,效率更高

  PublicPropertyGetdata()AsString

   data=sString

  EndProperty

  

  PrivateSubClass_Terminate()

   CallDetach

  EndSub


  用法如下,假設我們已通過VitualAlloc,HeapAlloc,MapViewOfFile這樣的內存管理API得到了一個4k個字節的可讀寫的內存地址baseAddr:
  

  DimsShareAsNewclsBSTR

  '留下前4個字節用於BSTR保存字串字節數

  sShare.Attach(baseAddr 4,4096-4)

  '下面的字串"Test"會直接寫到baseAddr 4字節處

  sShare="Test"

  DimyAsString

  '讀字串時可以用sString屬性或缺省屬性

  y=sShare.sString

  '用AttachStr方法Attach到一個字串。

  '必須要先Detach

  sShare.Detach

  sShare.AttachStr(y)

  sShare="Hahaha"

  Debug.Printy

  '一旦AttachStr到字串y後,對sShare的修改就相當於對y的修改。

  '並且以後對y的修改也只能用Mid語句

  Mid(y,1)="xxxxx"

  '不能直接賦值,這樣VB會將原來y所指(也是sShare所指)內存釋放,

  '重新分配y。這樣在訪問sShare時會出錯。

  'y="Test"

  使用這個類有幾個需要注意的地方。

  1、讀字串時可以用sString屬性來讀,更快。

  讀sShare有兩種方法,一種是用缺省屬性Data來讀,一種是直接用sString屬性來讀。用sString屬性不重新分配內存,要快得多。

  2、不要直接給sString賦值,應使用缺省的data屬性來賦值。

  之所以把sString屬性暴露出來,是為了效率和方便。我們可以用Mid語句對其進行修改,但不要直接用"="來賦值。

  3、注意Attach的第二個參數,表示字串的最大字節數,不要讓它超過已經分配的內存。

  4、用AttachStr將本字串對象Attach到某個字串(比如上面的y)上後,不能再對這個字串y重新賦值,也不能將其傳遞到會對其重新賦值的過程。

  這麼多需要注意的問題,用起來豈不是更不方便。的確,用它的之前要考慮是不是必須的。因為建立這個類也一樣有開銷。所以還有一個需要注意的問題:

  5、它主要的應用還是在於將字串安放在指定內存處。雖然它也可以讓同一個進程內幾個的字串達到共享的目的,但是如果只是兩三個很小的字串這樣時做反而慢了。

  後計:

  數組指針和字串指針我們已經談過了,對於普通的數值類型變量的指針沒有什麼Hack的必要,但是它關系到一個有用的技術,下篇文章再談。

->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved