在Delphi中将UnicodeString附加到WideString

时间:2013-08-15 13:41:38

标签: delphi unicode-string 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流代码中看到了这种反模式,并希望了解该过程。

2 个答案:

答案 0 :(得分:9)

要回答有关代码实际执行情况的问题,请填写此声明:

result := result + myUnicodeString;

以下内容:

  1. 调用System._UStrFromWStr()Result转换为临时UnicodeString

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

  3. 调用System._WStrFromUStr()将temp转换为WideString并将其分配回Result

  4. System._WStrCat()功能用于将WideString连接到WideStringSystem._UStrCat()连接UnicodeString)。如果CodeGear / Embarcadero对此更加聪明,他们可能实现了System._WStrCat()重载,它以UnicodeString作为输入,WideString作为输出(反之亦然,用于连接{{1}转到WideString)。这样,就不再需要临时UnicodeString次转化了。 UnicodeStringWideString都被编码为UTF-16(主要是这些,但我不会在这里进行讨论),因此将它们连接在一起只是一次分配和移动的问题,就像将两个UnicodeString或两个UnicodeString连接在一起时。

答案 1 :(得分:4)

表现不佳。因为一切都是UTF-16编码,所以不需要任何编码转换。但是,WideString是COM BSTR类型的包装器,其性能比原生UnicodeString更差。

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

这通常是一项好政策。您不希望在内部使用WideString,因为它纯粹是互操作类型。所以只能在互操作边界转换为(和来自)WideString。