| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Флейм > Что такое стек ? |
| Автор: Farhod 24.7.2002, 09:54 |
| Что такое стек ? спасибо |
| Автор: Vit 24.7.2002, 16:03 |
| Очередь. Примерно тоже что и рожок с патронами для автомата - туда можно что-то засунуть для хранения, и можно вытащить, но только в той очерёдности в которой оно засунуто. Например у тебя есть три функции: F1, F2, F3. функция F1 вызывает F2, а внутри F2 происходит вызов F3. Процессор обрабатывает код из F1, натыкается на F2, теперь всё что нужно было для работы с F1 (код и переменные) надо где-то запомнить, чтобы вернуться после обработки F2, так вот это всё и заталкивается в стек, далее управление передаётся F2. К моменту вызова F3, F2 тоже засовывается в стек. Теперь, когда F3 выполнена из стека достаётся F2, когда закончим с F2, достаётся F1... Правда с современными компилляторами и событийным программированием всё обстоит гораздо сложнее но стек всё равно очень интенсивно используется. У стека есть еще одно основополагающее свойство - заранее, на этапе разработки, никак нельзя узнать точно сколько именно памяти стека понадобиться. И на закуску пример переполнения стека на Дельфи: Procedure TForm1.Button1onclick(Sender:TObject); begin caption:='что-нибудь чтобы оптимизатор не удалил весь этот код'; Button1onclick(Sender); end; |
| Автор: Kesh 15.8.2002, 09:03 |
| Попробую доходчиво объяснить... У тебя на кухне есть вентиляция... Может быть ты и не задумывался, но она идеально подходит для хранения всяких пиратских дисков и прочего барахла, которое нужно спрятать от посторонних глаз... Дальше... Представим, что к тебе ломятся менты, которые чудом узнали о твоей причастности к краху торгового центра в Америке, наводнению в Европе, шторме в Новороссийске, распространению детской порнографии и т.д. Надо заметать следы... Ты хватаешь компакты с порнухой и запихиваешь их в вентиляцию... Потом хватаешь планы торгового центра и полетные карты американских пилотов и запихиваешь их туда же... Под конец ты заваливаешь вентиляционную дырку своими старыми нестиранными носками (Типа чтобы ментовская овчарка не нашла)... Уставший и гордый за свою находчивость ты идешь открывать дверь... А на пороге вместо ментов стоит твой друган Серега... с прискорбной миной и просьбой дать порнуху посмотреть... Твои действия: извлечь из вентиляции носки, потом карты и планы, потом достать диски и отдать их Сереге... На вопрос о том, что это за хрень с вентиляцией, ты теперь можешь смело заявить что проверял на практике работу со стеком... Special thanks to: ][akep.ru |
| Автор: MuToGeN 15.8.2002, 11:42 | ||
СУПЕР объяснение... раньше такого не слышал |
| Автор: FdX 16.8.2002, 08:35 | ||
| Мне тоже понравилось. Круто. А если короче, то это область памяти для хранения данных. "Вентиляция" эта растет вниз (к младшим адресам). Если не ошибаюсь, принцип работы называется "Last In First Out" или тоже самое, тока наоборот. Тоесть, положил туда сначала переменную n1, потом n2. Пока не возьмешь n2, n1 взять не можешь (вообщето можешь, но по-умному).
Может, я не совсем понял, но помойму можно. Если писать на асме, можно ведь просто сосчитать. В на языке высокого уровня, вроде Дельфи и С++, помойму тоже можно но очень сложно. |
| Автор: Vit 16.8.2002, 11:15 | ||||
Нельзя! НАпример ты вызываешь функцию рекурсивно - например проходишь все каталоги файловой системы, откуда ты можешь заранее знать сколько раз функция будет вызвана из самой себя и запихнута в стек. И нет никакой разницы в языке программирования. Вот пример, конечно он глупый, но на этапе разработки оценить размер понадобившегося стека можно только приблизительно, и с очень малой долей вероятности может понадобиться сколь угодно большой стек.
|
| Автор: Blade 29.8.2002, 04:51 |
| Первый ответ kesh'у, который я хотел написать: "Ты случайно не являешься редактором журнала хакер?" После этого прочёл преписку special th... Всё равно классно |
| Автор: Baa 29.8.2002, 08:32 |
| стек - область памяти, функционирующая по принципу LIFO, выделяемая программе для временного хранения адресов возврата при вызовах функций и процедур, передаваемых параметров и локальных переменных |
| Автор: Kesh 30.8.2002, 09:17 |
| Всем огромное спасибо за отзывы... |