代码之家  ›  专栏  ›  技术社区  ›  Jorge Córdoba

Delphi字符串是不变的吗?

  •  6
  • Jorge Córdoba  · 技术社区  · 17 年前

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

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

    第一个字符串被销毁,您将得到一个新字符串“hello world”的引用。

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

    我分配了一个用于标识多个变量的字符串散列,例如,一个“更改”由该更改的属性的散列值标识。这样我就可以很容易地检查“变化”是否平等。

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

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

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

    编辑:Delphi的版本是Delphi 7.0

    4 回复  |  直到 17 年前
        1
  •  20
  •   Barry Kelly    17 年前

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

    Delphi字符串不在内部。如果您从两个单独的代码段创建相同的字符串,它们将不会共享同一个备份存储区-相同的数据将存储两次。

        2
  •  4
  •   Henk Holterman    17 年前

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

    散列的结果还不清楚,您必须详细说明它们是如何存储的等等。

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

        3
  •  2
  •   Herbert Sitz    17 年前

    正如其他人所说,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

        4
  •  1
  •   Lucero    17 年前

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