我很好奇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;
涉及多少字符串转换,是否有任何特别糟糕的性能?
解决方法
要回答关于代码实际执行的问题,请使用以下语句:
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(主要是这些,但我不会在这里进行编码),因此将它们连接在一起只是一个分配和移动的问题,就像将两个UnicodeStrings或两个WideStrings连接在一起一样.