Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизПравильно ли использую 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.057 c