|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 10, 2003 18:52:27 · Поправил: AsmGuru62 Вопрос знатокам компиляторов: Я пишу на VC++ 6.0 и вижу странный код в прологе функции.
void foo ()
{
CHAR s [4096];
//...
}
Это вызывает странный CALL, который после манипуляций с ESP, всё-таки делает 'SUB ESP,1000h' как и положено. --- Вопрос: почему это надо и почему я не вижу простого: sub esp, 1000h как это сделано, если размер массива, скажем: "CHAR s[16]"? P.S.: Это происходит в 'RELEASE Build'. |
|
|
Дата: Сен 10, 2003 18:54:55 Если это под Debug - то там проверки на переполнение и т.п. Это под Release? |
|
|
Дата: Сен 10, 2003 19:00:03 volodya Это происходит в 'RELEASE Build'. |
|
|
Дата: Сен 10, 2003 19:13:32 У меня в 2002 ключик есть - /GS - установлен даже в Release mode. Ты установки хорошо проверил? Ясно ведь, что это компилятор выпендривается. |
|
|
Дата: Сен 10, 2003 19:24:48 Я ставлю /GS и он тут же исчезает после нажатия OK. Да и вообще: я прочитал про /GS - он ставит DWORD 'guard' на локальные массивы, т.е. генерирует больший код. Придётся, наверное, отказаться от крупных структур в стеке. |
|
|
Дата: Сен 10, 2003 19:29:54 Смутно я припоминаю, что что-то такое писал Robbins. Попробуй, посмотри на MSDN... Что-то конкретно от меня нужно? |
|
|
Дата: Сен 10, 2003 19:35:53 'Что-то конкретно от меня нужно?' Да нет, вроде... --- Я тут покопал GOOGLE немного. Похоже, что функция эта называется _alloca() и именно в случае достаточно большого локального массива компилятор сам вызывает её. Вопрос, как это поведение отключить?.. --- Спасибо, я поищу статью Robbins. |
|
|
Дата: Сен 10, 2003 19:44:17 · Поправил: Dr.Golova Лучше не отключать, а то так красиво упадет =) Эта функция нужна для роста стэка - как известно поверх стэка стоит только одна страница с атрибутом PAGE_GUARD, так вот функция для больших массивов чекает размер выделяемой памяти под локальные переменные и последовательно перебирает каждую страничка, обращаясь к ней, что в свою очередь какраз и наращивает стэк. А если перескочить страницу с PAGE_GUARD получится обычный Access Violation. А по поводу /Gs, в него кладется минимальный развер массиво после которого будет вызываться эта функция _chk_stk(), например /Gs8096 но как я уже намекал делать это следует только в том случае если ты хорошо понимаешь чем это может окончиться =) |
|
|
Дата: Сен 10, 2003 19:56:49 Кажется понял: стек имеет 'allocated pages', но не все 'pages' являются 'commited'... я правильно понял? |
|
|
Дата: Сен 10, 2003 19:58:58 Насколько я это дело понимаю - да. Джеффери Рихтер в своей книге это дело описывает. Если у тебя нет бумажной, вероятно, смогу подсобить с электронной :) |
|
|
Дата: Сен 10, 2003 20:17:48 Да нет, не надо... я пороюсь на форумах, MSDN, etc... |
|
|
Дата: Сен 10, 2003 20:23:52 AsmGuru62 стек имеет 'allocated pages', но не все 'pages' являются 'commited' Вы что-то стек с heap'ом путаете. |
|
|
Дата: Сен 10, 2003 21:33:19 Стек растет до лимита, отпущенного ему при компиляции, насколько я понимаю. Рост сопровождается движением страницы с PageGuard вниз в пространстве, отведенном стеку. А теперь пинайте меня, что я сказал не так. |
|
|
Дата: Сен 11, 2003 00:55:18 Вот здесь говорится о том, на что ссылался Dr. Golova: http://support.microsoft.com/default.aspx?scid=kb;en-us;100775 === т.е. теоретически надо попробовать: 1. В .DEF файле: "STACKSIZE 262144,262144" (256Kb for now) 2. В опциях компилятора: "/Gs262144" Сейчас попробуем!.. |
|
|
Дата: Сен 11, 2003 00:58:50 Quantum Вы что-то стек с heap'ом путаете. --- Да, вроде, не путаю... В статье (см. выше) ясно сказано про стек, что он имеет 'reserved pages' и 'commited pages'. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068 |