在Delphi中将UnicodeString附加到WideString

我很好奇Delphi 2010中的这段代码会发生什么:

function foo: WideString;
var 
   myUnicodeString: UnicodeString; 
begin
  for i:=1 to 1000 do
  begin
    myUnicodeString := ... something ...;

    result := result + myUnicodeString;  // This is where I'm interested
  end;
end;

涉及多少个字符串转换,并且是否有任何特别糟糕的性能?

我知道这个函数应该只是返回一个UnicodeString ,但我在VCL流代码中看到了这种反模式,并且想要了解这个过程。


为了回答你关于代码实际执行的问题,这个陈述:

result := result + myUnicodeString;

做以下事情:

  • 调用System._UStrFromWStr()Result转换为一个临时的UnicodeString

  • 调用System._UStrCat()myUnicodeString连接到temp

  • 调用System._WStrFromUStr()将temp转换为WideString并将其重新分配给Result

  • 有一个System._WStrCat()函数用于将WideString连接到WideString (以及用于UnicodeString System._UStrCat() )。 如果CodeGear / Embarcadero更聪明,他们可以实现一个System._WStrCat()重载,它将UnicodeString作为输入并将WideString作为输出(反之将WideString连接到UnicodeString )。 这样,不再需要临时的UnicodeString转换。 WideStringUnicodeString都被编码为UTF-16(主要是,但我不会在这里),所以将它们连接在一起只是一个分配和移动的问题,就像连接两个UnicodeString或两个WideString一起。


    表现很差。 由于所有内容都是UTF-16编码,因此不需要任何编码转换。 然而,WideString是COM BSTR类型的一个包装,它比原生的UnicodeString性能差。

    当然,您应该更喜欢使用本机类型(UnicodeString或TStringBuilder)完成所有工作,并在最后时刻转换为WideString。

    这通常是一个很好的政策。 你不想在内部使用WideString,因为它纯粹是一种互操作类型。 所以只能在互操作边界处转换(并从)WideString。

    链接地址: http://www.djcxy.com/p/61497.html

    上一篇: Appending UnicodeString to WideString in Delphi

    下一篇: How can I call a Delphi function that returns a string using JNA?