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

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

Правильно ли использую ZeroMemory ? И можно ли обнулить быстрее ? [D7]


Basement ©   (2006-11-17 02:45:00) 


type
 TMarkedA = record
   PaIndex : Integer;
   LmX, LmY, MinU, MinV, ScaleU, ScaleV : Single;
   LPa  : Integer
   Enabled        : Boolean;
 end;
var
 Marked : array of TMarkedA;
...
ZeroMemory(@Marked[0], SizeOf(TMarkedA) *Length(Marked));


KilkennyCat   (2006-11-18 15:21:00) [1]

можно еще просто подумать, возникнет ли обработка мусора (если он все-таки появится) в связи с особенностями алгоритма, который потом с ентими данными работает. Например, если в дальнейшем идет 100%-ое заполнение массива чем либо, то в любом варианте очистка не нужна. Если же идет заполнение случайным образом, не всех элементов, то лучше очистить. К тому же, очистка это же не просто заполнение вакуумом, а присваивание какого-либо значения, одного для всех. Это тоже можно использовать в полезных целях.


guav   (2006-11-18 15:16:00) [2]

> И можно ли обнулить быстрее ?

Можно попробовать написать или найти более быструю функцию обнуления, но вряд ли оно того стоит.

Более быстрые версии функций RTL, в т.ч. FillChar были написаны участниками The Fastcode Project
http://fastcode.sourceforge.net/


guav   (2006-11-18 15:10:00) [3]

> [13] Basement   (18.11.06 03:22)

Если смотреть на исходники RTL [9], то не надо. Если верить справке [12], то надо.
Если время выполнения критично, то можно и не обнулять, риск нарваться на изменение поведения DynArraySetLength в других версиях Delphi мал. Если время не критично, можно и ещё раз обнулить, чтобы сделать код более понятным.


Basement   (2006-11-18 03:22:00) [4]

Товарищи, скажите, пожалуйста, просто, без английского языка. Надо мне очищать структуру из первого постинга после первого SetLength, или нет ?


guav   (2006-11-17 14:13:00) [5]

> [10] Sapersky   (17.11.06 13:20)
> А чтобы не расписывать в справке - когда очищает, когда
> нет, сделали чтобы очищал всегда.

Таки в справке расписали, что когда string, etc - очищает, в противном случае - неопределённость.

Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined. The one exception is when increasing the length of a dynamic array in which the elements are types that must be initialized (strings, Variants, Variant arrays, or records that contain such types). When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.


KilkennyCat   (2006-11-17 13:22:00) [6]

> [9] Sapersky   (17.11.06 13:15)

понятно. спасибо. бум знать.


Sapersky   (2006-11-17 13:20:00) [7]

Видимо, сделано это для LongString и т.п. типов. А чтобы не расписывать в справке - когда очищает, когда нет, сделали чтобы очищал всегда.


Sapersky   (2006-11-17 13:15:00) [8]

Иначе - тебе ведь неочищенная память достанется

Из System.DynArraySetLength (Delphi 5, 7):

// Set the new memory to all zero bits
FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);

"new memory" в случае первого вызова означает "вся выделяемая".


ЮЮ   (2006-11-17 08:37:00) [9]


> После первого SetLength'а ZeroMemory делать не нужно.
>


А чем второй не угодил?  :) Если намерян распологать там новые данные, то можно и 0 длину сначала установить.


Loginov Dmitry   (2006-11-17 07:45:00) [10]

Basement   (17.11.06 3:04) [2]
После SetLength, нужно делать ZeroMemory ?


После первого SetLength'а ZeroMemory делать не нужно.


> И можно ли обнулить быстрее ?


Угу. FillChar(). Сэкономишь на целом вызове функции :)


ЮЮ   (2006-11-17 05:30:00) [11]

Нет, это ты в [3] его обещаешь :)


KilkennyCat   (2006-11-17 05:24:00) [12]

> [4] ЮЮ ©   (17.11.06 05:18)

а что, ты его там хочешь?


ЮЮ   (2006-11-17 05:18:00) [13]


> Иначе - тебе ведь неочищенная память достанется, может и
> с мусором быть.


Мне с динамическким масиивом никогда мусор не достается. Что я делаю не так?


KilkennyCat   (2006-11-17 03:07:00) [14]

да, если четко не знаешь, что и как потом из массива тащить будешь. Иначе - тебе ведь неочищенная память достанется, может и с мусором быть.


Basement   (2006-11-17 03:04:00) [15]

После SetLength, нужно делать ZeroMemory ?


KilkennyCat   (2006-11-17 02:59:00) [16]

http://www.team-x.ru/xforum/topic1339.html


Наверх

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