6

据我所知,字符串在 Delphi 中是不可变的。我有点理解这意味着如果你这样做:

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

第一个字符串被销毁,您将获得对新字符串“Hello World”的引用。

但是,如果您在代码周围的不同位置有相同的字符串,会发生什么?

我分配了一个字符串哈希来标识多个变量,例如,“更改”由该更改的属性的哈希值标识。这样我就很容易检查“更改”是否相等。

现在,每个散列都是单独计算的(并非所有属性都被考虑在内,因此即使实例在某些值上不同,它们也可以相等)。

问题是,Delphi 如何处理这些字符串?如果我计算将散列分隔为相同的 10 字节长度字符串,我会得到什么?两个 10 字节的内存块还是对同一个内存块的两个引用?

澄清:更改由从数据库读取的一些属性组成,并由单个线程生成。TChange 类有一个 GetHash 方法,该方法根据字符串中的某些值(但不是全部)计算哈希值。现在,其他线程收到更改并且必须将其与先前处理的更改进行比较,以便它们不会处理相同的(逻辑)更改。因此散列,并且由于它们具有单独的实例,因此计算了两个不同的字符串。我正在尝试确定从字符串更改为 128 位哈希之类的东西是否是一个真正的改进,否则只会浪费我的时间。

编辑:Delphi 的版本是 Delphi 7.0

4

4 回答 4

20

Delphi 字符串是在写入时复制的。如果您修改一个字符串(不使用指针技巧或类似技术来欺骗编译器),则不会影响对同一字符串的其他引用。

Delphi 字符串没有被保留。如果您从两个单独的代码部分创建相同的字符串,它们将不会共享相同的后备存储 - 相同的数据将被存储两次。

于 2009-04-16T13:25:02.777 回答
4

Delphi 字符串不是不可变的(尝试:string1[2] := 'a'),但它们是引用计数和写时复制的。

哈希的后果尚不清楚,您必须详细说明它们的存储方式等。

但是哈希应该只依赖于字符串的内容,而不是它的存储方式。这使整个问题变得无声。除非你能解释得更好。

于 2009-04-16T12:55:58.367 回答
2

正如其他人所说,Delphi 字符串通常不是不可变的。这里有一些关于 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 回答