Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Правильно ли использую ZeroMemory ? И можно ли обнулить быстрее ?   Найти похожие ветки 

 
Basement   (2006-11-17 02:45) [0]


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-17 02:59) [1]

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


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

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


 
KilkennyCat ©   (2006-11-17 03:07) [3]

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


 
ЮЮ ©   (2006-11-17 05:18) [4]


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


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


 
KilkennyCat ©   (2006-11-17 05:24) [5]

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

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


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

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


 
Loginov Dmitry ©   (2006-11-17 07:45) [7]

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


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


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


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


 
ЮЮ ©   (2006-11-17 08:37) [8]


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


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


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

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

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

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

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


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

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


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

> [9] Sapersky   (17.11.06 13:15)

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


 
guav ©   (2006-11-17 14:13) [12]

> [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.


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

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


 
guav ©   (2006-11-18 15:10) [14]

> [13] Basement   (18.11.06 03:22)

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


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

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

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

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


 
KilkennyCat ©   (2006-11-18 15:21) [16]

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.065 c
9-1139164310
HPR
2006-02-05 21:31
2006.12.03
И опять о плавности...


2-1163601511
term1t
2006-11-15 17:38
2006.12.03
FastReport


15-1163566298
vamp_avp
2006-11-15 07:51
2006.12.03
Траблтикет


15-1163485098
Denniz
2006-11-14 09:18
2006.12.03
Синяя панель Windows Explorer


15-1163154789
VEZ
2006-11-10 13:33
2006.12.03
Динамический TMainMenuActionBar