Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, grapes, Вы писали:
G>>Стек он забивает 0xCC V>В Debug-версии.
И проверки тоже в Debug версии.
Причем MSVC++ 6 в Дебаг-версии всегда восстанавливает стек при выходе из функции, поэтому если ты где-то напортачил внутри — то этого можешь даже и не заметить, а в релизе обязательно вылетит — у меня так было.
Здравствуйте, grapes, Вы писали:
G>И еще — если бы каждая вызываемая ф-ция размещала бы свои локальные переменные в стеке, то он бы просто лопнул — вот когда происходит глубокая рекурсия (ф-я сама себя вызывает) — это и происходит, а чтобы просто ф-ция с большим к-вом лок. пере-х стек перепелнила — такого еще не случалось (на моем веку)
Тебе вопрос, если бы даже место под локальные переменные выделялось в динамической памяти, где должны храниться указатели на эти пременные?
Здравствуйте, Владик, Вы писали:
В>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб
И что? Не умею я смотреть, неохота вникать в ассемблер. В>А после этого можно будет поспорить по поводу того, что всегда ли "динамическое" выделение памяти будет медленне "стэкового"
Так я и не спорю. Хотелось бы выяснить велики ли эти потери, да никак руки не доходят.
Здравствуйте, Валерий Б., Вы писали:
В>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб ВБ>И что? Не умею я смотреть, неохота вникать в ассемблер.
А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.
Здравствуйте, Валерий Б., Вы писали:
В>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб ВБ>И что? Не умею я смотреть, неохота вникать в ассемблер.
Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, Валерий Б., Вы писали:
В>>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб ВБ>>И что? Не умею я смотреть, неохота вникать в ассемблер.
V>Может использоваться _chkstk.
Здравствуйте, Владик, Вы писали:
В>Здравствуйте, Валерий Б., Вы писали:
В>>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб ВБ>>И что? Не умею я смотреть, неохота вникать в ассемблер.
В>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.
Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
А потом вызываются конструкторы в которых уже можно обращаться к любым членам объекта, т.к. они уже в доступной памяти.
А в С тоже всегда цикл вызывается? Там ведь уже и компилятору необязательно предварительно странички отъедать, если он сообразит, когда какой объект потребуется, то может соптимизирует это дело.
Здравствуйте, Валерий Б., Вы писали:
В>>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает. ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
Быстрее. Именно это _chkstk и делает.
Если программа использует RTL из ntdll.dll (у меня многие это делают) и описывается локальная структура больше 4K — эта функция вызывается, именно она все за раз и отъедает, без циклов.
Здравствуйте, Валерий Б., Вы писали:
ВБ>Здравствуйте, Владик, Вы писали:
В>>Здравствуйте, Валерий Б., Вы писали:
В>>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает. ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более, чем 256 раз. Не страшно.
Здравствуйте, Znow, Вы писали:
Z>При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более, чем 256 раз.
Да? А обосновать?
Или по вашему стек только расти может?
Здравствуйте, vasketsov, Вы писали:
Z>>При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более чем 256 раз. V>Да? А обосновать? V>Или по вашему стек только расти может?
Даже если вообразить себе тупой компилятор, в котором генерируется код, отъедающий от стека не более чем по одной странице за присест с тем, чтобы не проскочить охранную страницу и обеспечить корректную передачу страничной памяти в зарезервированное под стек виртуальное адресное пространство, — даже тогда трудно вообразить такой идиотизм как возврат системе этой самой страничной памяти ранее конца жизни потока. Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.
Т. к. обычный размер зарезервированного под стек ВАП в 1 МБ на Интеловской архитектуре равен 256 страницам, то такая передача произойдет не более чем 256 раз. Если она произойдет в 257 раз, то это уже будет переполнение стека.
Здравствуйте, Znow, Вы писали:
Z>Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.
Хорошо, пусть есть функция, в которой выделяется в стеке 100-килобайтная структура.
Я могу эту функцию вызвать 10 раз — и все, приплыли?
Здравствуйте, Валерий Б., Вы писали:
ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
Я тоже задавался этим вопросом Было это давно, и человек с которым я дискутировал как-то это обосновал (а может просто запарил Цикл с отъеданием по 4кб организует борландовский компилятор. С микрософтовским все хитрее. Как уже здесь говорилось он вызывает свою функцию, и кроме того, там в опциях компиляции можно указать размер этих "блоков".
ВБ>А потом вызываются конструкторы в которых уже можно обращаться к любым членам объекта, т.к. они уже в доступной памяти. ВБ>А в С тоже всегда цикл вызывается? Там ведь уже и компилятору необязательно предварительно странички отъедать, если он сообразит, когда какой объект потребуется, то может соптимизирует это дело.
Здравствуйте, vasketsov, Вы писали:
Z>>Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.
V>Хорошо, пусть есть функция, в которой выделяется в стеке 100-килобайтная структура. V>Я могу эту функцию вызвать 10 раз — и все, приплыли?
Если там 10 уровней рекурсии, — то да, приплыли.
Если 10 раз последовательно, то, ясное дело, передача страничной памяти, если и будет выполняться, то лишь в первый раз. В остальное время охранная страница будет уже отодвинута достаточно далеко, чтобы не быть достигнутой. Соответственно, указатель вершины стека будет бугать туда-сюда в рамках пространства стека, под которое страничная память уже передана.
Здравствуйте, Znow, Вы писали:
Z>Взаимное недопонимание устранено или я в чем-то заблуждаюсь?
Да нет, видимо, о разных вещах говорим.
Я утверждал, что текущее положение в стеке откатывается, ты — что вершина не откатывается.
И то и другое одновременно, очевидно, может реализовываться.
Правда, то что память не освобождается — ничуть не очевидно.
Зато дизассемблирование _chkstk дает много поучительной имформации.
Здравствуйте, Znow, Вы писали:
Z>Я такое говорил? Где?
Пара постов вверх.
Опять же, под вершиной РАЗНОЕ может быть понято, видишь как легко флейм провоцировать?
Большинство считает, что вершина стека — это его текущее положение, исторически так принято.
В данном случае реально вершина болтается где-то посредине между вершиной в смысле переданой памяти и базового адреса стека.
Вот и все, а ты испугался.