Delphi字符串是不可变的吗?

时间:2009-04-16 12:50:00

标签: delphi string memory immutability

据我所知,字符串在Delphi中是不可变的。我有点明白这意味着你做了:

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

第一个字符串被销毁,你得到一个新字符串“Hello World”的引用。

但是如果你的代码周围的不同地方有相同的字符串会怎样?

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

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

问题是,Delphi如何处理这些字符串?如果我计算将哈希值分离为相同的10个字节长度的字符串,我该怎么办?两个10字节的内存块或两个引用相同的内存块?

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

编辑:Delphi的版本是Delphi 7.0

4 个答案:

答案 0 :(得分:20)

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

Delphi字符串没有实习。如果从两个独立的代码段创建相同的字符串,它们将不会共享相同的后备存储 - 相同的数据将被存储两次。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:1)

Delphi版本可能很重要。好的旧Delphi BCL处理字符串作为写时复制,这基本上意味着当字符串中的某些内容发生更改时会创建一个新实例。所以是的,它们或多或少是不可变的。