2009-04-16 4 views
6

私が知る限り、文字列はDelphiでは不変です。あなたがそうするなら、私は理解できます。Delphiの文字列は不変ですか?

string1 := 'Hello'; 
string1 := string1 + " World"; 

最初の文字列が破棄され、新しい文字列 "Hello World"への参照が取得されます。

しかし、同じ文字列がコードの異なる場所にあるとどうなりますか?

私は、いくつかの変数を識別するために割り当てられた文字列ハッシュを持っています。したがって、例えば、「変更」はその変更のプロパティのハッシュ値によって識別されます。そうすれば、平等のための「変更」をチェックするのは簡単です。

ここで、各ハッシュは別々に計算されます(一部の値が異なる場合でもインスタンスを分離するためにすべてのプロパティが考慮されるわけではありません)。

質問は、Delphiはどのようにこれらの文字列を処理しますか?ハッシュを同じ10バイトの長さの文字列に分割するように計算すると、何が得られますか? 10バイトの2つのメモリブロックまたは同じメモリブロックへの2つの参照?

明確化:変更は、データベースから読み取られたいくつかのプロパティによって構成され、個々のスレッドによって生成されます。 TChangeクラスには、GetHashメソッドがあり、文字列の結果となる値の一部(すべてではない)に基づいてハッシュを計算します。今度は、他のスレッドが変更を受け取り、以前に処理された変更と比較して、同じ(論理的な)変更を処理しないようにしなければなりません。したがって、ハッシュと、別々のインスタンスを持つので、2つの異なる文字列が計算されます。私は文字列から128ビットのハッシュのようなものに変更することが本当の改善かどうかを判断しようとしています。それは時間を無駄にするだけです。

編集:デルファイのバージョンのDelphi 7.0である

答えて

20

デルファイ文字列はコピーオンライトです。文字列を変更した場合(ポインタトリックやコンパイラを欺くための同様の手法を使用しない場合)、同じ文字列への他の参照は影響を受けません。

Delphiの文字列は使用できません。 2つのコードセクションから同じ文字列を作成すると、同じバッキングストアは共有されません。同じデータが2回保存されます。

+0

DLLの文字列操作に問題がありました。検索IsMultiThreadがfalseに設定されていることがわかりました。 System.pasで宣言されており、文字列参照のカウントと格納を変更するときに使用されます。私の初期化のセクションでそれをtrueに設定すると、私の問題が解決されました。 –

+0

Stijn - 参照カウント機構は、マルチスレッド化に安全なバスロックインクリメントおよびデクリメント命令を使用します。これらは通常のincとdecよりも遅いです。 IsMultiThreadは、Delphi内からスレッドを作成することによって設定されます。もちろん、Delphi以外のスレッドを作成したり、基本となる基本APIを使用してスレッドを作成しても、それはわかりません。 –

0

Delphiのバージョンを知ることが重要であるかもしれません。古いDelphi BCLは文字列をコピーオンライトとして扱います。これは基本的に、文字列内の何かが変更されたときに新しいインスタンスが作成されることを意味します。そう、彼らは多かれ少なかれ不変です。

+1

事は、私は、コードの2つの異なるセクションから同じ文字列を生成する場合はどうすれば...ですか?これはコピーライトではありません... –

+0

BCL?私はあなたがRTLを意味すると思う。 (あなたはVCLを意味するわけではなく、VCLは文字列の動作を制御しません) –

+0

@Jorge:同じ内容の文字列を生成しても同じ参照にはなりません。しかし、これは不変性とは関係ありません。 @Rob:BCLはベースクラスライブラリを表し、RTLはその獣の1つです...;) – Lucero

4

Delphiの文字列は不変ではありませんが(try:string1 [2]:= 'a')、参照カウントと書き込み時にコピーされます。

あなたのハッシュのための結果が明らかにされていない、あなたは彼らが保存されている方法を詳細にする必要がありますなど

しかし、ハッシュは、文字列の内容ではなく、それが保存されている方法のみに依存すべきです。それは全体の質問をミュートにします。あなたがそれをより良く説明できなければ。

+0

実際には、ハッシュはいくつかの情報や情報の要約として見ることができます。それは基本的に私がやっていることです。クラス内の値をハッシュにまと​​めるのは、文字列(ハッシュ値ではありません!)です。 –

関連する問題