![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли WideString спокойно использовать вместо String? [D7]
SPeller © (2009-02-16 13:04:00)Дело в том, что написал себе небольшую обёртку над libxml, сначала везде использовал string. Но потом понадобилась поддержка юникода в классах и utf-8 в xml и я просто взял и заменил все декларации со string на WideString, добавив где надо utf8encode/decode. Работать работает, но тут наткнулся в хелпе на то, что string имеет встроенный счетчик ссылок, а WideString - нет. И вообще, местами говорят, что WideString это больше для COM, нежели для поддержки юникода в программе. А поскольку в этом аспекте я не сильно компетентен, то закрались сомнения - использование этих двух типов чем-нибудь различно? Не надо ли делать дополнительных телодвижений чтобы небыло каких-нибудь утечек?
Riply (2009-02-18 17:12:00) [21]> [15] Сергей М. © (18.02.09 17:03)
> А шо делать, если xml - это строки и ничто кроме строк ?)
"Не держись устава яко слепой стены" (с) коментарий Петра Первого к уставу, написанному им же :)
А если серьезно, то в данном случае, видимо, придется выбирать между
"критичностью к скорости" и способом хранения данных.
Сергей М. (2009-02-18 17:03:00) [22]
> Riply © (18.02.09 16:57) [14]
А шо делать, если xml - это строки и ничто кроме строк ?)
Riply (2009-02-18 16:57:00) [23][12] SPeller © (18.02.09 12:47)
> Значит, критичные к скорости операции не стоит связывать с юникодом.
IMHO, в "критичныч к скорости операциях", вообще не стоит использовать работу со строками.
Сергей М. (2009-02-18 12:51:00) [24]
> когда я передаю из msvс++ кода указатель на структуру BSTR,
> принимаю его у себя как PWideString
А надо бы как PWide Char
SPeller (2009-02-18 12:47:00) [25]
> KSergey © (18.02.09 07:29) [10]
> Да. Все даже еще круче: их можно принимать/возвращать/модифицировать(!
> ) в функциях dll, собранных без общего менеджера памяти!
Это я вкурсе, что этот тип совместим с BSTR и можно его пользовать везде где угодно. Просто сомнения что эти строки при интенсивном использовании неизвестно когда и кем будут освобождены. Например, когда я передаю из msvс++ кода указатель на структуру BSTR, принимаю его у себя как PWideString, задаю ему значение, то присвоенное значение спокойно доступно в вызывающем коде. А кто и когда при этом освободит память, занимаемую этой строкой? Если вызывать из дельфийского кода, то смысл, думаю, не изменится. Кто освободит и когда?
> Сергей М. © (18.02.09 08:13) [11]
Значит, критичные к скорости операции не стоит связывать с юникодом.
Сергей М. (2009-02-18 08:13:00) [26]
> Какова скорость работы менеджера oleaut32 по сравнению с
> дельфийским менеджером?
Думаю что при прочих равных условиях, характерных именно для дельфийскогоприложения, он уступает по производительности BMM и FastMem.
KSergey (2009-02-18 07:29:00) [27]> SPeller © (18.02.09 02:19) [9]
> Могу ли я спокойно пользоваться WideString так же как и string?
Да. Все даже еще круче: их можно принимать/возвращать/модифицировать(!) в функциях dll, собранных без общего менеджера памяти!
SPeller (2009-02-18 02:19:00) [28]Могу ли я спокойно пользоваться WideString так же как и string? Или таки нужно знать и учитывать нюансы? Какова скорость работы менеджера oleaut32 по сравнению с дельфийским менеджером?
Jack128_ (2009-02-17 17:08:00) [29]
>
> Сч-к в дан.случае контролируется не компилятором, а oleauto32
я понимаю. Но и присвоение вайдстрингов тоже контролируется олешным MemoryManager'ом. W2 := W1 фактически сводится к вызову SysReAllocStringLen. Если бы у Widestring'ов был счетчик ссылок, то SysReAllocStringLen можно было бы реализовать гараздо эффективнее для частного случая присвоения одной строки другой. Как это в делфийском компилере сделано..
Сергей М. (2009-02-17 16:53:00) [30]
> Jack128_
Сч-к в дан.случае контролируется не компилятором, а oleauto32
Jack128_ (2009-02-17 16:36:00) [31]
>
> > string имеет встроенный счетчик ссылок, а WideString -
> нет
>
>
> WideString тоже имеет.
ну видимо он какой то странный счетчик..
procedure TForm1.FormCreate(Sender: TObject);
var
W1, W2: WideString;
S1, S2: AnsiString;
begin
W1 := StringOfChar(' ' , 10);
S1 := W1;
S2 := S1;
W2 := W1;
Caption := Format('Wide pointers equality = %s, Ansi equality = %s', [
BoolToStr(Pointer(W1) = Pointer(W2), True), // False
BoolToStr(Pointer(S1) = Pointer(S2), True)]); // True
end;
Сергей М. (2009-02-17 16:11:00) [32]
> WideString это больше для COM, нежели для поддержки юникода
> в программе
И для того и для другого.
Основное отличие - память под собственно строку распределяется/перераспределяется/освобождается менеджером в составе oleauto32.dll
> string имеет встроенный счетчик ссылок, а WideString - нет
WideString тоже имеет.
SPeller (2009-02-17 15:48:00) [33]не можешь написать по существу - молчи лучше
Медвежонок Пятачок (2009-02-17 14:04:00) [34]а я что-то про классы сказал?
SPeller (2009-02-17 00:49:00) [35]читай внимательней. юникод в классах
Медвежонок Пятачок (2009-02-16 13:48:00) [36]для utf-8 widestring вообще не нужен