2010-09-27 167 views
0

是什麼Wrtiting字符串內存流 - 指向字符串的指針

這之間的區別:

SourceString := 'I am doing just fine!';  
MemoryStream.ReadBuffer(Pointer(SourceString)^, xxx); 

(完整的源代碼可以在這裏:http://edn.embarcadero.com/article/26416

和驗證碼(礦):

SetLength(SourceString, xxx); 
MemoryStream.ReadBuffer(SourceString[1], xxx); 
  1. 我真的必須使用指針(SourceString)^或SourceString [1]也可以嗎?
  2. 代碼(他們兩個)將與德爾福2010年(unicode)?

回答

2

1:SourceString[1]版本更具可讀性。當他們不是完全必要時,我更喜歡不使用指針。

2:此代碼將而不是使用Unicode。你必須乘以它:xxx * sizeof(Char)。 (這將適用於德爾福的Unicode版本之前和之後的版本。)但是,除非大量使用非Ansi字符,否則這將會造成很大的空間浪費。我更喜歡做的是:

procedure TStreamEx.WriteString(const data: string); 
var 
    len: cardinal; 
    oString: UTF8String; 
begin 
    oString := UTF8String(data); 
    len := length(oString); 
    self.WriteBuffer(len, 4); 
    if len > 0 then 
    self.WriteBuffer(oString[1], len); 
end; 

procedure TStreamEx.ReadString(const data: string); 
var 
    len: cardinal; 
    iString: UTF8String; 
begin 
    self.ReadBuffer(len, 4); 
    if len > 0 then 
    begin 
    SetLength(iString, len); 
    self.ReadBuffer(iString[1], len); 
    result := string(iString); 
    end 
    else result := ''; 
end; 

(這是一個class helper for TStream我寫的,讓人們更方便讀取和寫入各種事情,並從流的一部分,但如果你不喜歡類幫手,它不應該是太難的基本思路適應不同的格式)

+0

「這是TStream的類助手的一部分」 - 我的代碼也來自我自己的類助手:)雖然我很確定它不會與Delphi 2010一起工作,除非將字符串更改爲AnsiString(我剛剛做過)。儘管如此,我並不是真的對保存UNICOE感興趣,我承認我會更新我的代碼(使用你的)來支持UNICODE。謝謝。 – Ampere 2010-09-27 22:24:26

+0

SourceString [1]版本更具可讀性 - 感謝Mason的確認。我在Borland的網站上找到了這些代碼,我認爲「如果他們以此爲例,它肯定是一些東西。」做它更復雜的是什麼? – Ampere 2010-09-27 22:30:07

+5

當你有範圍檢查啓用(你應該總是啓用範圍檢查),那麼當SourceString [1]'長度爲零時會引發一個異常,而'Pointer(SourceString)'將是一個空指針,因爲你傳入的字節數也是零,所以不會被取消引用。請參閱*清單4 * [我的網站](http://www.cs.wisc.edu/~rkennedy/string-stream)。 – 2010-09-27 22:39:46

2

在生成的彙編代碼:

  • 指針(ASTRING)^將直接傳遞串地址的程序/功能/方法;
  • aString [1]將調用UniqueString然後將字符串地址傳遞給過程/函數/方法。

所以指針(ASTRING)^要使用,如果你即將讀取數據,而不是對其進行修改。

And aString [1]用於在被調用函數中修改aString的情況。

在實踐中,我使用指針(aString)^它可以產生更高效的代碼。

注意,這隱含UniqueString是不是這麼慢:如果字符串的當前引用計數爲1(這意味着有使用字符串,這很可能只是一個代碼的一部分),它返回立即。但是在用於檢查引用計數值的UniqueString中有一個LOCK asm前綴,並且使用此LOCK asm不是多線程友好的。這就是爲什麼我在編碼時儘量避免使用aString [1]

附加說明:如果ASTRING是 '',指針(ASTRING)將返回

+0

換句話說,指針(aString)^更快,而aString [1]更安全? – Ampere 2010-09-28 19:06:21

+0

你可以這麼說:)但在某些情況下,對UniqueString的隱式調用是強制性的以避免內存損壞:在使用指針(aString)之前,您可以使用明確的UniqueString調用^如果您希望代碼既安全又快速 – 2010-09-29 11:31:26