在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
转换。 WideString
和UnicodeString
都被编码为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?