我很好奇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流代码中看到了这种反模式,并希望了解该过程。
答案 0 :(得分:9)
要回答有关代码实际执行情况的问题,请填写此声明:
result := result + myUnicodeString;
以下内容:
调用System._UStrFromWStr()
将Result
转换为临时UnicodeString
调用System._UStrCat()
将myUnicodeString
连接到temp
调用System._WStrFromUStr()
将temp转换为WideString
并将其分配回Result
。
System._WStrCat()
功能用于将WideString
连接到WideString
(System._UStrCat()
连接UnicodeString
)。如果CodeGear / Embarcadero对此更加聪明,他们可能实现了System._WStrCat()
重载,它以UnicodeString
作为输入,WideString
作为输出(反之亦然,用于连接{{1}转到WideString
)。这样,就不再需要临时UnicodeString
次转化了。 UnicodeString
和WideString
都被编码为UTF-16(主要是这些,但我不会在这里进行讨论),因此将它们连接在一起只是一次分配和移动的问题,就像将两个UnicodeString
或两个UnicodeString
连接在一起时。
答案 1 :(得分:4)
表现不佳。因为一切都是UTF-16编码,所以不需要任何编码转换。但是,WideString是COM BSTR类型的包装器,其性能比原生UnicodeString更差。
当然,您应该更喜欢使用本机类型(UnicodeString或TStringBuilder)完成所有工作,并在最后一刻转换为WideString。
这通常是一项好政策。您不希望在内部使用WideString,因为它纯粹是互操作类型。所以只能在互操作边界转换为(和来自)WideString。