В настройках проекта я эту дрянь отключил, но теперь, если есть в локальных буффер больше, чем 4 кб, то компилятор отказывается компилить, требуя объявить _chkstk. Надобности в этой функции именно в данном проекте нет, т.к. я сделал вот так: Некрасиво, зато удобно. Вопрос: как отучить компилятор требовать _chkstk, даже если среди локальных есть вот такое BYTE some_buf[0x2000];
>на плюсах не пробовал, но на си BYTE some_buf[0x20000]; норм компалит Сделай рандомное обращение к буфферу. например к нулевому и к 0x10000-му байту например вот так: some_buf[0] = 1; some_buf[0x10000] = 2; и скомпиль
смысл этой функи вот в чем стек имеет такую же страничную вирто память, как и обычная но память довыделяется автоматически те, за последней уже выделенной под стек страницей находится 1 сигнальная страница. обращение к которой заставляет ось выделить под стек еще одну страницу. а следущая станет сигнальной. итд но если вы обратитесь в стеке ниже сигнальной страницы (например, массив большой), то произойдет исключение, тк память там еще не выделена и сигнальных страниц там нет. вот эта функция и обращается к стеку с шагом в страницу, чтоб память была наверняка выделена. _chkstk: ; ecx == size of locals mov eax,esp @@: mov [esp],eax sub esp,1000h sub ecx,1000h jnc short @b @@: mov esp,eax ret
qqwe Да, я знаю в чем смыл данной функции. Тут в другом дело. Для меня скорость выполнения очень важна. Некоторые функции вызываются по много тысяч раз в цикле. И оперируют они с большими объемами данных. И каждый раз делать VirtualAlloc / VirtualFree под каждый буффер неудобно. А суммарный размер буфферов может доходить до 100 мб. 16мб в первом посте - это просто как пример. Передавать указатель на буффер в аргументах тоже неудобно, а делать все буфферы глобальными я не хочу. Поэтому я выделяю 100 мб и заменяю стек на свой. Сделал для _chkstk заглушку вида _asm retn. Но хотелось бы, данной заглушки не было, т.к. не вижу в ней необходимости, в отличие от компилятора. Компилятор vs очень гибкий поэтому я поинтересовался, реально ли сделать так, чтобы компилятор не требовал _chkstk
dyn делать такие буфера в стеке нельзя. под стек резервируется ограниченное место и при превышении его он легко может пересечься с чем нибудь еще специально для таких случаев и были придуманы объекты. те, не глобально, не локально, а еще 1 уровень абстракции между ними. вы можете передавать буфер или структуру с параметрами и буфером между функциями. или перейти на С++ или другой оо язык, где указатель на эту структуру будет передаваться неявно автоматически.
Есть много недокументированных ключей, попробуй http://members.ozemail.com.au/~geoffch@ozemail.com.au/samples/programming/msvc/cl/c1xx/options/index.html