Как отучить С++ компилятор от vs использовать _chkstk?

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 9 фев 2011.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    В настройках проекта я эту дрянь отключил, но теперь, если есть в локальных буффер больше, чем 4 кб,
    то компилятор отказывается компилить, требуя объявить _chkstk.

    Надобности в этой функции именно в данном проекте нет, т.к. я сделал вот так:

    Некрасиво, зато удобно.



    Вопрос: как отучить компилятор требовать _chkstk, даже если среди локальных есть вот такое
    BYTE some_buf[0x2000];
     
  2. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    никак, только свою определить
     
  3. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    dyn
    на плюсах не пробовал, но на си BYTE some_buf[0x20000]; норм компалит
     
  4. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
  5. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    >на плюсах не пробовал, но на си BYTE some_buf[0x20000]; норм компалит

    Сделай рандомное обращение к буфферу.
    например к нулевому и к 0x10000-му байту

    например вот так:
    some_buf[0] = 1;
    some_buf[0x10000] = 2;

    и скомпиль
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    смысл этой функи вот в чем
    стек имеет такую же страничную вирто память, как и обычная
    но память довыделяется автоматически
    те, за последней уже выделенной под стек страницей находится 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
     
  7. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    qqwe
    Да, я знаю в чем смыл данной функции.
    Тут в другом дело.
    Для меня скорость выполнения очень важна.
    Некоторые функции вызываются по много тысяч раз в цикле. И оперируют они с большими объемами данных.
    И каждый раз делать VirtualAlloc / VirtualFree под каждый буффер неудобно. А суммарный размер буфферов может доходить до 100 мб. 16мб в первом посте - это просто как пример.
    Передавать указатель на буффер в аргументах тоже неудобно, а делать все буфферы глобальными я не хочу.
    Поэтому я выделяю 100 мб и заменяю стек на свой.

    Сделал для _chkstk заглушку вида _asm retn. Но хотелось бы, данной заглушки не было, т.к. не вижу в ней необходимости, в отличие от компилятора.

    Компилятор vs очень гибкий поэтому я поинтересовался, реально ли сделать так, чтобы компилятор не требовал _chkstk
     
  8. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    /STACK:reserve,commit
     
  9. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Пробовал. Потолок - 8 мб. Дальше запускаться перестает.
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    dyn
    делать такие буфера в стеке нельзя. под стек резервируется ограниченное место и при превышении его он легко может пересечься с чем нибудь еще

    специально для таких случаев и были придуманы объекты.
    те, не глобально, не локально, а еще 1 уровень абстракции между ними.
    вы можете передавать буфер или структуру с параметрами и буфером между функциями.
    или перейти на С++ или другой оо язык, где указатель на эту структуру будет передаваться неявно автоматически.
     
  11. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Есть много недокументированных ключей, попробуй http://members.ozemail.com.au/~geoffch@ozemail.com.au/samples/programming/msvc/cl/c1xx/options/index.html