Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли WideString спокойно использовать вместо String? [D7]


Страницы:   1 2

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 вообще не нужен


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо