Является ли WideString идентичным String в Delphi 2009
Я получаю какое-то странное поведение, перекомпилирующее некоторые приложения в 2009 году, которые использовали самые широкие точки в разных точках.
В приложении Delphi 2009 приложение Widestring идентично String?
Ответы
Ответ 1
Нет, они не являются idenitical.
WideString
- это просто оболочка для типа ActiveX/COM BSTR
. Это необходимо при работе со строками в ActiveX/COM.
String
в Delphi 2009 и позже является псевдонимом для UnicodeString
, который может содержать символы Юникода, как это делает BSTR
, но это НЕ то же самое, что и WideString
. WideString
выделяется диспетчером памяти COM и не подсчитывается ссылка. UnicodeString
выделяется диспетчером памяти RTL и подсчитывается по ссылке, точно так же, как AnsiString
.
Вы можете использовать (Unicode)String
везде, где это возможно, и использовать только WideString
для COM-взаимодействия или иметь дело с устаревшими библиотеками, которые используют WideString
для поддержки Unicode.
Ответ 2
Кажется, ответ здесь:
Наиболее драматичным изменением в Delphi 2009 является то, что тип "string" теперь является псевдонимом UnicodeString вместо AnsiString.
Ответ 3
Еще одно важное замечание - разница в производительности.
В Marco Cantu White Paper (упоминается в ответе moodforaday) говорится:
"WideString была (и до сих пор) не подсчитана ссылкой и крайне плоха с точки зрения производительности и гибкости (например, она использует глобальный распределитель памяти Windows, а не собственный FastMM4).
Почти каждое руководство по обновлению для Delphi 2009, которое я видел, рекомендует вам конвертировать все WideStrings в Strings.
Ответ 4
См. эту статью Марко Канту, которая описывает работу строки (например, UnicodeString) в Delphi 2009:
"Белая книга: Дельфы и Юникод"
http://dn.codegear.com/article/38980
В принципе, это то, что сказал Родди, но занимает 27 страниц, чтобы подробно остановиться.