Конференция "Прочее" » Куча или стек ?
 
  • DevilDevil © (09.08.08 12:14) [0]
    Доброе время суток, уважаемые форумчане.

    Есть задача, в которой необходимо заюзать неопределённое количество памяти с минимальной время-потерей.

    Предположим, я имею возможность отхватить какой-то кусок стековой памяти. С другой стороны, я могу отхватить кусок из кучи, но это дольше по времени.

    Вопрос сформулирован примерно следйющим образом...
    Где граница (размер в байтах), превышая которую лучше (быстрее, безопаснее, ...) отхватить кусок из кучи ?
  • Sergey Masloff (09.08.08 12:21) [1]
    Что значит отхватить?
  • Zeqfreed © (09.08.08 12:33) [2]
    > Где граница (размер в байтах), превышая которую лучше (быстрее,
    >  безопаснее, ...) отхватить кусок из кучи ?

    stacksize?
  • DevilDevil © (09.08.08 12:33) [3]
    function OthvatitStek(Size: integer): pointer;
    asm
     // eax := esp - eax - 1024
     add eax, 1024
     neg eax
     add eax, esp
    end;

    function OnvatitKuchu(Size: integer): pointer;
    begin
     GetMem(Result, Size);
    end;

  • DevilDevil © (09.08.08 12:40) [4]
    > Zeqfreed ©   (09.08.08 12:33) [2]

    что есть "stacksize" ?

    Для стека используется особый страничный механизм. Если запрашиваешь данные с неоткрытой страницы, то страница открывается. Ещё страницы помечаются каким-то флагом для StackOverflow... хотя я могу что-то путать. Влюбом случае, операции со стеком немного опасны, а возможно и более ресурсоёмки чем GetMem при определённых размерах.

    В общем, нужен человек, который про стек знает многое, который разъяснит ситуацию и подскажет решение.
  • Loginov Dmitry © (09.08.08 13:04) [5]
    > В общем, нужен человек, который про стек знает многое...


    А Рихтер не подходит?
    :)
  • DevilDevil © (09.08.08 13:09) [6]
    рихтер - это долго.
  • Sergey Masloff (09.08.08 14:02) [7]
    >рихтер - это долго.
    Зато навсегда.

    >DevilDevil ©   (09.08.08 12:33) [3]
    Ну так-то быстрее. Естественно двинуть указатель и все. Но кто мешает взять в куче сразу большую область и точно также двигать по ней указатели?
  • DevilDevil © (09.08.08 14:21) [8]
    > Sergey Masloff   (09.08.08 14:02) [7]
    > Зато навсегда.


    Если не заблуждаюсь, тема не о пользе прочтения рихтера.

    > Но кто мешает взять в куче сразу большую область и точно также
    > двигать по ней указатели?


    Ну так-то проще - отписать ересь какую-нибудь вместо ответа на чётко сформулированный вопрос.
  • Sergey Masloff (09.08.08 15:02) [9]
    DevilDevil ©   (09.08.08 14:21) [8]
    Терминология на вашей совести.
    Никакой четкости в вопросе нет.
    Я описал вариант работы с кучей который не будет отличаться от работы со стеком. То есть никакой границы нет. Как в стеке никто (почти) не будет следить за безопасностью так и в куче. Скорость доступа к стеку и к куче может быть практически одинаковой.
  • DevilDevil © (09.08.08 15:06) [10]
    вопрос открыт
  • VirEx © (09.08.08 15:16) [11]
    для резервации больших объемов памяти - куча, для малых - стек
    вопрос закрыт
  • Zeqfreed © (09.08.08 15:17) [12]
    Есть вариант, что оптимизировать надо в другом месте.
  • DevilDevil © (09.08.08 15:18) [13]
    > для резервации больших объемов памяти - куча, для малых
    > - стеквопрос закрыт


    золотые слова!!!
    в том то и вопрос: "большой объём" - это сколько байт ?
  • oxffff © (09.08.08 15:22) [14]

    > DevilDevil ©   (09.08.08 15:06) [10]
    > вопрос открыт


    Если ты можешь гарантировать что страницы стека будут гарантировано подгружены заранее,т.е. организовать unpageable pool, то стек естественно более предпочтительней поскольку вся операция Alloc это
    sub esp, Size.
    Однако в противном случае при работе со стеком тебе придется выделять постранично генерируя исключение процессора для выделения физической страницы. Что естественно очень накладно. Тогда предпочтение естественно куча.

    НО!!! Я бы выбрал другой вариант

    Никто не мешает организовать тебе свой менеджер памяти.  VirtualAlloc тебе в помощь.
  • DevilDevil © (09.08.08 15:34) [15]
    > oxffff ©   (09.08.08 15:22) [14]

    для объёмов в 4, 10 или 100 байт свой или Delphi-йский менеджер памяти - дело относительно накладное. А вот пару мегабайт уже надо бы в куче делать. Вот и вопрос: где же эта граница ?

    я не могу гарантировать, что страницы стека будут гарантированно подгружены.
  • oxffff © (09.08.08 15:36) [16]

    > дело относительно накладное.


    Относительно чего?


    > где же эта граница ?


    Граница у автора.
  • VirEx © (09.08.08 15:38) [17]

    >  [15] DevilDevil ©   (09.08.08 15:34)
    > Вот и вопрос: где же эта граница
    > ?

    так проверь свободную физическую память и выбирай
  • DevilDevil © (09.08.08 15:42) [18]
    if (Size > SOME_CONST) then
     P := GetMem(Size)
    else
    asm
     push eax

     lea eax, esp-100
     dec eax, Size
     mov P, eax

     pop eax
    end;

    if (Size > SOME_CONST) then
     FreeMem(P);



    Вот такой вариант мне нравится намного больше, чем реализация собственного менеджера памяти и заюзывания VirtualAlloc
  • DevilDevil © (09.08.08 15:43) [19]
    вопрос: чему равна
    SOME_CONST

    ?

    > VirEx ©   (09.08.08 15:38) [17]
    > так проверь свободную физическую память и выбирай


    уточни, пожалуйста.
  • oxffff © (09.08.08 15:48) [20]

    > DevilDevil ©   (09.08.08 15:42) [18]


    У тебя код не правильный.
  • DevilDevil © (09.08.08 15:52) [21]
    > oxffff ©   (09.08.08 15:48) [20]
    опечатки в коде не имеют отношения к обсуждаемому вопросу.
  • oxffff © (09.08.08 16:01) [22]

    > DevilDevil ©   (09.08.08 15:52) [21]


    Это не опечатки.
    Почему не изменяется ESP?
  • DevilDevil © (09.08.08 16:20) [23]
    > oxffff ©   (09.08.08 16:01) [22]
    > Почему не изменяется ESP?


    обусловимся, что подобная махинация со стеком действует исключительно в этой функции, вызовов других функций внутри этой не производится.
  • oxffff © (09.08.08 16:45) [24]

    > DevilDevil ©   (09.08.08 16:20) [23]


    Явно ты можешь их не вызывать, за тебя это может сделать компилятор.
    Однако представь, что будет с твоими данными, если возникнет исключение.
  • Юрий Зотов © (10.08.08 02:26) [25]
    > DevilDevil ©   (09.08.08 15:18) [13]

    > "большой объём" - это сколько байт?

    Семь.
  • Dimka Maslov © (10.08.08 11:00) [26]
    Для единичного зохавывания блока памяти разницы никакой нет, стек или куча. Если зохавывание выполняется в цикле - есть. Но если блок достаточно большой, то для его обработки потребуется куда как большее время нежели на выделение. Отсюда мораль - а не вынести ли выделение за пределы цикла, используя выделенный блок по новой в каждой итерации. Тогда "потери времени" станут незначительными.
  • Rouse_ © (10.08.08 12:51) [27]

    > DevilDevil ©

    ИМХО ты не стой стороны подходишь к оптимизации. К тому-же при использовании стека ты имеешь большой, даже огромный шанс, исчерпать его лимит при рекурссионном алгоритме. Я бы делал другим образом - выделял бы единовременно необходимый блок памяти с запасом и на него навернул бы некий механизм, реализующий одобную работу с размещенными данными.
 
Конференция "Прочее" » Куча или стек ?
Есть новые Нет новых   [134439   +52][b:0][p:0.002]