Re[4]: Резервирование стека при вызове ф-й
От: Stanislav Kondratiev  
Дата: 31.01.03 14:33
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, grapes, Вы писали:


G>>Стек он забивает 0xCC

V>В Debug-версии.
И проверки тоже в Debug версии.
Причем MSVC++ 6 в Дебаг-версии всегда восстанавливает стек при выходе из функции, поэтому если ты где-то напортачил внутри — то этого можешь даже и не заметить, а в релизе обязательно вылетит — у меня так было.
Re[2]: Резервирование стека при вызове ф-й
От: comer США http://getboost.codeplex.com/
Дата: 31.01.03 14:44
Оценка:
Здравствуйте, grapes, Вы писали:

G>И еще — если бы каждая вызываемая ф-ция размещала бы свои локальные переменные в стеке, то он бы просто лопнул — вот когда происходит глубокая рекурсия (ф-я сама себя вызывает) — это и происходит, а чтобы просто ф-ция с большим к-вом лок. пере-х стек перепелнила — такого еще не случалось (на моем веку)


Тебе вопрос, если бы даже место под локальные переменные выделялось в динамической памяти, где должны храниться указатели на эти пременные?
getboost.codeplex.com
citylizard.codeplex.com
Re[5]: Резервирование стека при вызове ф-й
От: Валерий Б. Россия  
Дата: 31.01.03 14:57
Оценка:
Здравствуйте, Владик, Вы писали:

В>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб

И что? Не умею я смотреть, неохота вникать в ассемблер.
В>А после этого можно будет поспорить по поводу того, что всегда ли "динамическое" выделение памяти будет медленне "стэкового"
Так я и не спорю. Хотелось бы выяснить велики ли эти потери, да никак руки не доходят.
Re[6]: Резервирование стека при вызове ф-й
От: Владик Россия  
Дата: 31.01.03 15:04
Оценка: 4 (1)
Здравствуйте, Валерий Б., Вы писали:

В>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб

ВБ>И что? Не умею я смотреть, неохота вникать в ассемблер.

А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.
Как все запущенно...
Re[6]: Резервирование стека при вызове ф-й
От: vasketsov Россия http://ntprog.by.ru
Дата: 31.01.03 15:15
Оценка:
Здравствуйте, Валерий Б., Вы писали:

В>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб

ВБ>И что? Не умею я смотреть, неохота вникать в ассемблер.

Может использоваться _chkstk.
Васкецов Сергей
http://registry.km.ru
Re[7]: Резервирование стека при вызове ф-й
От: grapes  
Дата: 31.01.03 15:18
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, Валерий Б., Вы писали:


В>>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб

ВБ>>И что? Не умею я смотреть, неохота вникать в ассемблер.

V>Может использоваться _chkstk.



Там юзается _chkesp
Re[7]: Резервирование стека при вызове ф-й
От: Валерий Б. Россия  
Дата: 31.01.03 15:22
Оценка:
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, Валерий Б., Вы писали:


В>>>А ты (ради интереса) посмотри, что компилятор делает, когда размер локальных переменных переваливает через 4кб

ВБ>>И что? Не умею я смотреть, неохота вникать в ассемблер.

В>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.

Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
А потом вызываются конструкторы в которых уже можно обращаться к любым членам объекта, т.к. они уже в доступной памяти.
А в С тоже всегда цикл вызывается? Там ведь уже и компилятору необязательно предварительно странички отъедать, если он сообразит, когда какой объект потребуется, то может соптимизирует это дело.
Re[3]: Резервирование стека при вызове ф-й
От: MaximE Великобритания  
Дата: 31.01.03 15:26
Оценка:
Здравствуйте, vasketsov, Вы писали:


V>Переполнение стека — серезная проблема, она существует с самого начала вычислительной техники, ибо стек — это базовая форма хранения данных.


Offtopic.
Базовых форм две: массив и список. Стэк может быть релизован либо как первое, либо как второе — больше никак.
Re[8]: Резервирование стека при вызове ф-й
От: vasketsov Россия http://ntprog.by.ru
Дата: 31.01.03 15:31
Оценка: 4 (1)
Здравствуйте, Валерий Б., Вы писали:

В>>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.

ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?
Быстрее. Именно это _chkstk и делает.
Если программа использует RTL из ntdll.dll (у меня многие это делают) и описывается локальная структура больше 4K — эта функция вызывается, именно она все за раз и отъедает, без циклов.
Васкецов Сергей
http://registry.km.ru
Re[8]: Резервирование стека при вызове ф-й
От: Znow  
Дата: 31.01.03 15:33
Оценка:
Здравствуйте, Валерий Б., Вы писали:

ВБ>Здравствуйте, Владик, Вы писали:


В>>Здравствуйте, Валерий Б., Вы писали:


В>>А там как раз цикл организуется, который последовательно по 4кб от стэка отъедает.

ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?

При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более, чем 256 раз. Не страшно.
Re[4]: Резервирование стека при вызове ф-й
От: vasketsov Россия http://ntprog.by.ru
Дата: 31.01.03 15:33
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Базовых форм две: массив и список.

Гы. А также LIFO и FIFO. И что?
Васкецов Сергей
http://registry.km.ru
Re[9]: Резервирование стека при вызове ф-й
От: vasketsov Россия http://ntprog.by.ru
Дата: 31.01.03 15:36
Оценка:
Здравствуйте, Znow, Вы писали:

Z>При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более, чем 256 раз.

Да? А обосновать?
Или по вашему стек только расти может?
Васкецов Сергей
http://registry.km.ru
Re[10]: Резервирование стека при вызове ф-й
От: Znow  
Дата: 31.01.03 15:56
Оценка:
Здравствуйте, vasketsov, Вы писали:

Z>>При размере стека потока в 1 Мб такое передвижение "шажками" за время его жизни произойдет не более чем 256 раз.

V>Да? А обосновать?
V>Или по вашему стек только расти может?

Даже если вообразить себе тупой компилятор, в котором генерируется код, отъедающий от стека не более чем по одной странице за присест с тем, чтобы не проскочить охранную страницу и обеспечить корректную передачу страничной памяти в зарезервированное под стек виртуальное адресное пространство, — даже тогда трудно вообразить такой идиотизм как возврат системе этой самой страничной памяти ранее конца жизни потока. Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.

Т. к. обычный размер зарезервированного под стек ВАП в 1 МБ на Интеловской архитектуре равен 256 страницам, то такая передача произойдет не более чем 256 раз. Если она произойдет в 257 раз, то это уже будет переполнение стека.
Re[11]: Резервирование стека при вызове ф-й
От: vasketsov Россия http://ntprog.by.ru
Дата: 31.01.03 16:09
Оценка:
Здравствуйте, Znow, Вы писали:

Z>Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.


Хорошо, пусть есть функция, в которой выделяется в стеке 100-килобайтная структура.
Я могу эту функцию вызвать 10 раз — и все, приплыли?
Васкецов Сергей
http://registry.km.ru
Re[8]: Резервирование стека при вызове ф-й
От: Аноним  
Дата: 01.02.03 09:12
Оценка: 2 (1)
Здравствуйте, Валерий Б., Вы писали:

ВБ>Мат-перемат. А разве APIшными функциями ему не быстрее их всех сразу отъесть?


Я тоже задавался этим вопросом Было это давно, и человек с которым я дискутировал как-то это обосновал (а может просто запарил Цикл с отъеданием по 4кб организует борландовский компилятор. С микрософтовским все хитрее. Как уже здесь говорилось он вызывает свою функцию, и кроме того, там в опциях компиляции можно указать размер этих "блоков".

ВБ>А потом вызываются конструкторы в которых уже можно обращаться к любым членам объекта, т.к. они уже в доступной памяти.

ВБ>А в С тоже всегда цикл вызывается? Там ведь уже и компилятору необязательно предварительно странички отъедать, если он сообразит, когда какой объект потребуется, то может соптимизирует это дело.
Re[12]: Резервирование стека при вызове ф-й
От: Znow  
Дата: 01.02.03 12:51
Оценка:
Здравствуйте, vasketsov, Вы писали:

Z>>Если же и такое бывает (хотя до такого терроризма додуматься трудно), то, конечно, приведенное выше мое утверждение неверно.


V>Хорошо, пусть есть функция, в которой выделяется в стеке 100-килобайтная структура.

V>Я могу эту функцию вызвать 10 раз — и все, приплыли?

Если там 10 уровней рекурсии, — то да, приплыли.

Если 10 раз последовательно, то, ясное дело, передача страничной памяти, если и будет выполняться, то лишь в первый раз. В остальное время охранная страница будет уже отодвинута достаточно далеко, чтобы не быть достигнутой. Соответственно, указатель вершины стека будет бугать туда-сюда в рамках пространства стека, под которое страничная память уже передана.
Re[13]: Хотелось бы получить ответ
От: Znow  
Дата: 04.02.03 07:06
Оценка:
Взаимное недопонимание устранено или я в чем-то заблуждаюсь?

Очень неприятно ошибаться и не знать этого. Так что хотелось бы получить ответ.
Re[14]: Хотелось бы получить ответ
От: vasketsov Россия http://ntprog.by.ru
Дата: 04.02.03 17:42
Оценка:
Здравствуйте, Znow, Вы писали:

Z>Взаимное недопонимание устранено или я в чем-то заблуждаюсь?

Да нет, видимо, о разных вещах говорим.
Я утверждал, что текущее положение в стеке откатывается, ты — что вершина не откатывается.
И то и другое одновременно, очевидно, может реализовываться.
Правда, то что память не освобождается — ничуть не очевидно.
Зато дизассемблирование _chkstk дает много поучительной имформации.
Васкецов Сергей
http://registry.km.ru
Re[15]: Хотелось бы получить ответ
От: Znow  
Дата: 04.02.03 17:46
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Я утверждал, что текущее положение в стеке откатывается, ты — что вершина не откатывается.


Я такое говорил? Где?
Re[16]: Хотелось бы получить ответ
От: vasketsov Россия http://ntprog.by.ru
Дата: 04.02.03 19:27
Оценка:
Здравствуйте, Znow, Вы писали:

Z>Я такое говорил? Где?


Пара постов вверх.
Опять же, под вершиной РАЗНОЕ может быть понято, видишь как легко флейм провоцировать?
Большинство считает, что вершина стека — это его текущее положение, исторически так принято.
В данном случае реально вершина болтается где-то посредине между вершиной в смысле переданой памяти и базового адреса стека.
Вот и все, а ты испугался.
Васкецов Сергей
http://registry.km.ru
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.