Как контролировать размер стека при написании dll для сторонней программы? #741256


#0 by H A D G E H O G s
Дня доброго. Вот есть процесс (1С), которому задали размер стека в 1 мегабайт (пусть будет все по человечьи). Вопрос - каждый раз, подгружая новые dll-ки - они будут расходовать эту стековую память? Или для каждой новой dll-ки будет выделена отдельная область виртуальной памяти для размещения своего стека? Пните в faq, пжлст.
#1 by H A D G E H O G s
И еще вопрос. Вот есть у меня процедура procedure Test var end; 50 кбайт памяти стека будет занято: 1) Сразу после загрузки программы? 2) В момент выполнения процедуры?
#2 by Serginio1
Стек используется при входе в роцедуру и освобождается после выхода. Вернее просто передвигается указатель начала стека
#3 by Serginio1
#4 by Serginio1
#5 by H A D G E H O G s
Это для параметров функции (если не fastcall) и адреса возврата. Но я счаст проверю практически, это просто.
#6 by H A D G E H O G s
спс, счаст прочту.
#7 by Serginio1
FastCall это другое Память для глобальных переменных выделяется в сегменте данных приложения и освобождается при его завершении. Локальные переменные живут в стеке (stack). Каждый раз при вызове процедур или функций для них выделяется память, которая освобождается при выходе из процедуры или функции, хотя оптимизация компилятора может их уничтожить гораздо раньше. Стек приложения определяется двумя значениями: минимальным и максимальным размером. Эти значения задаются директивами компилятора $MINSTACKSIZE (по умолчанию - 16 384 байта) и $MAXSTACKSIZE (по умолчанию - 1 048 576 байт). Винда сообщит об ошибке, если она не сможет при запуске приложения предоставить ему минимальный размер памяти для стека. Если приложению требуется больше стековой памяти, чем указано в $MINSTACKSIZE, то она выделяется блоками по 4 Kb. Если очередное выделение памяти обламывается, то ли потому, что памяти больше нет, то ли потому, что суммарный объём запрошенной стековой памяти превысил $MAXSTACKSIZE, генерится эксепшн: EstackOverflow, причём контроль переполнения стека является полностью автоматическим, директива $S, когда-то позволявшая его отключить, оставлена только для совместимости с предыдущими версиями.
#8 by vde69
Дмитрий вроде на дельфях пишет, а там многое зависит от модели компиляции, а точнее используется - ли паскалевская виртуальная среда или компелится без нее (как с++), в среде там контроль за стеком отведен среде, но его можно заоверлочить прямыми операциями с памятью.... в то время как винда "честный" стек не дает оверлочить.....
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С