xpin2013
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору AlekXL Цитата: и что? хелпер копирует содержимое, а приведение в изначальном примере копирует указатель. | Приведение для XE7 не нужно, приводится тот же тип к тому же, для D2010 нужно. Цитата: ты ошибаешься, и это не признак ума, когда ошибки свои не хочешь признавать .. | Только представь, Питер Нортон написал Нортон Коммандер. Когда нажимаем F3 он показывает внутренности файла в виде байтов, но его попросили показать как текст. Конечно он мог бы выделить такой же буфер как для байтов и перекопировать туда байты как AnsiChar, но увы DOS память была маленькая и про то, что желание не делать лишнюю копию считается ошибкой никто не знал от Нортона до Delphi 2010. Все ошибались... Цитата: Разница между D2010 и XE7 может быть только в порядке финализации объектов. | Цитата: В Delphi 2010 могло быть иначе | Проверяется на раз: Код: procedure TForm2.Button1Click(Sender: TObject); var B: TBookmarkStr; v: variant; begin Table1.Open; B := TBookmarkStr(Table1.Bookmark); v := null; Table1.Bookmark := TBookmark(B); end; | 1)В финализации - финализируется динамический массив. Количество ссылок 1. Вызывается фреемем 2)Финализируется строка. Количество ссылок 1. Вызывается фреемем. 3)Сравниваем адреса переменных в стеке - они разные. В _DynArrayClear попатает динамический массив с корректным typeinfo. Переменная строки туда не попадает. 4):=TBookmarkStr(Table1.Bookmark); вызывает LStrLAsg - собственно копирование строки. И в D2010 и в XE7. В D2010 вызывается GetMem для новой строки, в XE7 GetMem не вызывается, увеличивается ссылка, по этому Current := '' - уменьшает ссылку и затирает в стеке "неверный" указатель на строку, хотя компонентам гридам не надо изменять строку, не надо typeinfo, ничего не надо - счётчик ссылок и размер у динамического массива и строки в одном и том же месте. TBookmark2 повторяет D2010, Только := TBookmark2(vTable1.Bookmark); делает тоже самое но корректно - UniqueString копирует строку, а LStrLAsg в код не подставляется. По выделениям памяти - всё то же, + стек увеличен на рекорд. Но TBookmark2 не вызывает всякие Winapi.MultiByte, а LStrLAsg в 2010 вызывает, так что код 2010 медленнее чем Xe7 + TBookmark2. Цитата: Разница в том, что в случае с LStrClr в FreeMem передается указатель (p-sizeof(TStrRec)), а в DynArrayClear -- указатель (p-sizeof(DynArrayRec)). Они не одинаковые. Доходит? | Нет, передаётся один и тот же указатель у которого p-Sizeof(4)-это размер у DynArrayRec и у TStrRec, и p-Sizeof(8) -это счётчик ссылок и у DynArrayRec и у TStrRec. Весь код работы с букмарками не использует вообще других данных DynArrayRec и TStrRec. Для всего кода программы кроме финализации они одинаковые. Доходит? Код: procedure TForm1.Button2Click(Sender: TObject); var b: TBytes; a: array of Byte; begin a := b; | Сообщение компилятора [dcc32 Error] Unit1.pas(80): E2010 Incompatible types: 'Dynamic array' and 'System.TArray<System.Byte>' Можешь перевести? Чувствую что Dynamic array не то же самое что "Динамический массив"? Боюсь Вы начнёте объяснять разницу, а не станете аккуратнее использовать фразу "Динамический массив". Призываю, давайте объясним Питеру Нортону, что показывать текст не копируя при этом массив байтов в массив букв - это не признак ума это ошибка. Это нам доказал AlekXL и .NET своими генериками, которые кстати легко преобразуются UNSAFE методами без всяких каприз - как угодно вообще. Но нубы которые не знают системных объектов, этого конечно не сделают, отсюда мажорные нападки о несовместимости. | Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 13:00 12-01-2015 | Исправлено: xpin2013, 13:02 12-01-2015 |
|