Rock
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору nick7inc Цитата: Правильно ли я понимаю, что между блоками, где пропадает видимость массива buf[] память не возвращается стеку (в общем, это ухищрение бесполезно с точки зрения возврата памяти), а возврат будет по факту только при выходе из функции test()? | Цитата: Я смотрел за регистром ESP и SS, вообще в ассемблере не сильно шарю, но по значению ESP получалось выделение в той же области, если строчки идентичные, и в новой области, если во втором случае размер отличается. | Здесь, скорее всего, лучше знать не ассемблер, а что такое стек приложения -- Вам обязательно нужно посмотреть на его структуру в Интернете. Это самая простая структура в программировании. Выделение/освобождение в этом стеке -- это просто запись нового адреса в ESP. То есть, фактически бесплатно. Но есть одно, или даже два НО. В системах с виртуальной памятью (а вот эта концепция гораздо сложнее стека) операционная система может и однозначно будет выделять и, скорее всего освобождать, особенно при нехватке памяти, физические страницы памяти под стек по мере их использования. Причем, выделение физической страницы под стек -- это очень дорогая процедура. Вы завели очередную переменную в стеке, ESP передвинулся, но физической памяти в этом месте адресного пространства нет, Вы записываете туда что-то важное, возникает исключение ошибки памяти, которое перехватывает ОС, видит, что пишется в разрешенную область, под которую просто не подсунута реальная память, берет свободную физическую страницу (кстати, в подавляющем большинстве ОС это 4Кб, как и Ваши массивы), подсовывает ее в адресное пространства стека, куда было обращение, и возвращает управление Вашей программе для переповтора операции записи. Всем этим можно в какой-то степени управлять ключами компоновщика. Но люди чаще из практических соображений заменяют память в стеке на память из кучи -- стек гораздо быстрее кончается. Еще однозначно в плане производительности пострадает процессорный кэш. TLDR в самом общем случае, если не экономить стек, программа будет работать медленнее. В некоторых сценариях сильно медленнее. |