У меня есть движок симуляции, написанный на Visual C ++ 2010, и я реализую плагин DLL на его основе для другого стороннего приложения.
Тем не менее, я получаю ошибку переполнения стека, когда моя библиотека вызывается потоком стороннего приложения. После отладки оказалось, что для DLL требуется больший размер стека, чем для потока. Можно ли как-то расширить размер стека текущего потока?
Я знаю, что мне, вероятно, следует пересмотреть код механизма моделирования и переместить большие объекты в кучу. Проблема заключается в том, что движок обслуживается другим поставщиком, и я бы хотел, по возможности, не изменять его код.
Я думаю о создании своего собственного потока в DLL с большим размером стека и возвращении результатов вызывающему потоку после завершения вычисления. Это правильный подход?
Спасибо,
Michal
Я собираюсь предположить, что первый вы проверяете, сколько стекового пространства вы на самом деле используете. Вы размещаете большие объекты в стеке? Использует ли ваша программа значительную глубину рекурсии? Напишите тестовое приложение-ловушку, которое вы можете связать со своей DLL, и проверьте, сколько стекового пространства вы используете
Если вы размещаете большие объекты в стеке, я настоятельно рекомендую переместить их в кучу.
Если вы делаете значительную рекурсию, вы можете исследовать цикл с использованием стека на основе кучи, поддерживаемого вашей DLL, а не полагаться на стек приложения.
Я делаю эти предложения просто потому, что плагин гораздо менее навязчив, чтобы быть автономным и не требовать специальной конфигурации стека (или даже полностью отдельного потока, просто чтобы иметь больший стек).
Visual Studio предоставляет два варианта изменения размера стека по умолчанию (1 МБ):
/ F для компилятора:
https://docs.microsoft.com/cpp/build/reference/f-set-stack-size
/ STACK для компоновщика:
https://docs.microsoft.com/cpp/build/reference/stack