6

私の知る限り、Delphi では文字列は不変です。あなたがそうするなら、私はそれが意味することをちょっと理解しています:

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

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

しかし、コード内の異なる場所に同じ文字列がある場合はどうなるでしょうか?

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

現在、各ハッシュは個別に計算されます (すべてのプロパティが考慮されるわけではないため、一部の値が異なっていてもインスタンスを分離することができます)。

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

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

編集:DelphiのバージョンはDelphi 7.0です

4

4 に答える 4

20

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

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

于 2009-04-16T13:25:02.777 に答える
4

Delphi 文字列は不変ではありませんが(string1[2] := 'a' を試してください)、参照カウントされ、コピー オン ライトです。

ハッシュの結果は明確ではありません。ハッシュがどのように保存されているかなどを詳しく説明する必要があります.

ただし、ハッシュは、文字列の格納方法ではなく、文字列の内容のみに依存する必要があります。これにより、質問全体がミュートになります。あなたがそれをもっとうまく説明できない限り。

于 2009-04-16T12:55:58.367 に答える
2

As others have said, Delphi strings are not generally immutable. Here are a few references on strings in Delphi.

http://blog.marcocantu.com/blog/delphi_super_duper_strings.html

http://conferences.codegear.com/he/article/32120

http://www.codexterity.com/delphistrings.htm

于 2009-04-16T16:34:08.253 に答える
1

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

于 2009-04-16T12:52:05.133 に答える