
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (14) « Первая ... 12 13 [14] все ( Перейти к последнему сообщению ) |
Сообщ.
#196
,
|
|
|
Цитата [S]mike @ Такой прием называется "дай обезьяне гранату" (без намеков на ник ). Можно конечно воспользоваться. Но стоит элементарно где-то описАться, как получим кучу труднонаходимых ошибок. Приведённая примером статья, хотя и содержит несколько случаев, но предлагает использовать absolute всего для одной вещи: уменьшения шума в коде от приведения типов или переприсваивания указателей. При таком использовании опасности absolute не превышают опасностей оригинального кода (с использованием указателей или преведений типов). Поэтому "стоит элементарно где-то описАться" - это не недостаток absolute. Это недостаток жёсткого приведения типа или использования указателей. Другими словами, ситуация с absolute как минимум не хуже оригинала. Я просканировал комменты, но не нашёл ни одного, говорящего про недостаток именно самого absolute, а не операции, которую он подменяет. Цитата Во всяком случае их использование следует минимизировать, а не декларировать все указателем, потом через absolute "приводить" к нужным типам Несомненно. Лично я к goto, absolute и указателям отношусь как "можно использовать только в разрешённых верховной партией случаях" ![]() P.S. Цитата Для первого примера с компонентами RTTI или WinAPI было бы более удобным способом. Это же просто пример. Он сделан на компонентах, чтобы писать меньше кода - не надо описывать классы. В целом же там могут быть не компоненты, классы без RTTI и даже вовсе не классы. Простой пример: записи, чьё содержимое трактуется по первому полю. |
![]() |
Сообщ.
#197
,
|
|
хм. не знал что можно еще и классы так приводить. и я всегда почему то считал что ссылка absolute всегда должна быть одного размера с исходной переменной.
Добавлено я не один такой. "мой" баг пометили как дубликат и по ссылке я узнал что он тянется еще с 2009 версии. |
![]() |
Сообщ.
#198
,
|
|
Цитата ViktorXP @ FreeAndNil(I);// а вот это жесть. и оно не ругается на это. даже не предупреждает. это было всегда и во всех версиях дельфи. можно сделать аналог, без этого недостатка ![]() ![]() TObjectHelper = class public procedure FreeAndNil<T: TObject>(var Obj: T); end; procedure TObjectHelper.FreeAndNil<T: TObject>(var Obj: T); begin SysUtils.FreeAndNil(Obj); end; Obj: TObject; I: Integer; TObjectHelper.FreeAndNil<TObject>(Obj); // компилится TObjectHelper.FreeAndNil<Integer>(I); // НЕ компилится |
Сообщ.
#199
,
|
|
|
Что-то я не понял
Цитата 'Packed' Now Forces Byte Alignment of Records If you have legacy code that uses the packed record type and you want to link with an external DLL or with C++, you need to remove the word "packed" from your code. The packed keyword now forces byte alignment, whereas in the past it did not necessarily do this. The behavior change is related to C++ alignment compatibility changes in Delphi 2009. http://docwiki.embarcadero.com/RADStudio/en/Delphi_Compiler_Changes_for_XE2 Цитата Record Type Data Field Alignment In previous versions of Delphi, packed records were used to ensure proper data alignment when calling external libraries and notably certain external Windows API functions that require record or struct parameters. Unused data fields were introduced to "pad things out" and make the needed data fields line up as needed. The current compiler implementation eliminates the need for using packed records this way, in most cases. Revising your existing source code to eliminate needless packed records and "padding" makes the source more clear and easier to maintain. If you require that your existing data files maintain compatibility with older versions of Delphi, apply the compiler directive {$OLDTYPELAYOUT ON} to source code where the older record organization is still needed. http://docwiki.embarcadero.com/RADStudio/en/Converting_32-bit_Delphi_Applications_to_64-bit_Windows Что они в итоге сделали с packed? |
Сообщ.
#200
,
|
|
|
![]() |
Сообщ.
#201
,
|
|
немного не понял про Packed. он идет теперь по умолчанию и его можно не указывать или все так как прежде. с Packed пакует без Packed выравнивает.
Добавлено все. по примеру я понял. если внутри есть пакованная запись то и эта запись будет паковаться |
Сообщ.
#202
,
|
|
|
Если фишка именно в выравнивании начала записи (в массивах, я так полагаю - а где еще?), то причем тут код в DLL? И еще интересно, как согласуют выравнивание полей в записях, переправляющихся в WinAPI функции.
|
Сообщ.
#203
,
|
|
|
Расположение записи на стеке тоже выравнивается.
|
![]() |
Сообщ.
#204
,
|
|
Цитата ViktorXP @ с Packed пакует без Packed выравнивает. ![]() Но такое поведение вроде нужно директивами задавать. |
![]() |
Сообщ.
#205
,
|
|
да нет. вроде он по умолчанию выравнивает до восьми или до четырех байт. это если хочешь поменять изменить это то либо packed либо директивы. лично я юзаю packed лишь тогда когда мне нужно "кучно" собрать байты. во всех других случаях это потеря производительности.
|
![]() |
Сообщ.
#206
,
|
|
Да
![]() Цитата ViktorXP @ с Packed пакует без Packed выравнивает. А ты попробуй поиграться с директивами {$OLDTYPELAYOUT} и {$A} кста, а какая у тебя версия Delphi (а то я тут тебе советую..)? Добавлено Цитата ViktorXP @ вроде он по умолчанию выравнивает до восьми или до четырех байт Судя по встроенному help'у (XE2 - Update3, Help - Update3) - выравнивает до 8 (quadword). |
Сообщ.
#207
,
|
|
|
Меня в основном волнует, не изменилось ли поведение при указании packed.
|