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

Вниз

На суд народа   Найти похожие ветки 

 
Ultr ©   (2004-04-30 18:03) [0]

В sysutil"е (помоему) есть ф-я    GetDir(drive,var result), которая в большинстве случаев используется с drive=0, и возвращает путь текущей папки , в ее коде юзается ф-я GetCurrentDirectory, с параметрром типа PAnsiChar, так вот этот парам. работает только если его, так сказать проинициализить, то-бишь память выделить, в GetDir это делается путем задания переменной типа array[0..259] of Char, но на мой взгляд это не оптимально с точки зрения памяти (конечно один раз 260 байт - не много, но в делфях все аналогичные ф-и прописаны именно так), я предлагаю сделать так:

function CurDir: string;
var temp: PAnsiChar;
begin
   GetMem(temp,MAX_PATH);    ---  выделяем память динамически
   GetCurrentDirectory(MAX_PATH,temp);
   result:=temp;
   FreeMem(temp);            --- а потам и высвобождаем
   if length(result)>3 then result:=result+"\";
end;</CODE

конечно у такого варианта есть свой минус - грубо говоря перекладываем нагрузку с памяти на процессор, но по-моему для ф-й такого рода это не страшно, т.к. вызываются они по идее один раз за запуск.  (а в делфевском варианте получается ты один раз запустил ф-ю - 260 байт забил,и так они и висят до конца)


 
Gero ©   (2004-04-30 18:08) [1]

Пост не читал, но по коду могу сказать, что try..finally не помешал бы.


 
Ultr ©   (2004-04-30 18:11) [2]

а зачем здесь try..finally...  ???  :((


 
Gero ©   (2004-04-30 18:23) [3]

GetMem - FreeMem.
Хотя я могу и ошибаться...


 
Ultr ©   (2004-04-30 18:24) [4]

люди ответьте по сути (try..fin не суть)


 
Jack128 ©   (2004-04-30 18:28) [5]


> а в делфевском варианте получается ты один раз запустил
> ф-ю - 260 байт забил,и так они и висят до конца)
до выхода из функции и висят эти 260 байт. Тоже, что и твоем варианте..


 
Ultr ©   (2004-04-30 18:32) [6]

Вот и не правда, удаляются прикрасно...

(проверял ставя вместо MAX_PATH чило 1000000(~мег)-на начале процедуры мег приростает, а по окончании отпадает.)


 
default ©   (2004-04-30 20:04) [7]

Ultr ©   (30.04.04 18:32) [6]
наоборот код sysutils самый быстрый, вместо всяких GetMem-ов и FreeMem-ов для выделения памяти используется стек, а кусок в нём выделяется одной командой add esp, -$...


 
default ©   (2004-04-30 20:05) [8]

лучше сказать что не выделяется, а резервируется наверно


 
Anatoly Podgoretsky ©   (2004-04-30 20:18) [9]

Ultr ©   (30.04.04 18:03)  
Ты не понимаешь как работает стек и локальные переменные в процедуре. Вот твой код по сранению со стандартным очень неоптимален.



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

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

Наверх




Память: 0.49 MB
Время: 0.053 c
3-1083074531
AlexBalex
2004-04-27 18:02
2004.05.23
Обновление указанной записи с помощью resync


3-1082983859
Женя
2004-04-26 16:50
2004.05.23
как узнать тип и длину поля tAdoTable


3-1083035329
fbi
2004-04-27 07:08
2004.05.23
Фильтрация


6-1081243802
Mihail
2004-04-06 13:30
2004.05.23
Уважаемые мастера! Такой вопрос - мне нужно узнать IP адреса всех


14-1083759377
ele-lena
2004-05-05 16:16
2004.05.23
ImagExpress. Где взять?