![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно ли использую 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