Что делать, когда DLL нужен больший размер стека, чем у основного exe-приложения?

У меня есть движок симуляции, написанный на Visual C ++ 2010, и я реализую плагин DLL на его основе для другого стороннего приложения.

Тем не менее, я получаю ошибку переполнения стека, когда моя библиотека вызывается потоком стороннего приложения. После отладки оказалось, что для DLL требуется больший размер стека, чем для потока. Можно ли как-то расширить размер стека текущего потока?

Я знаю, что мне, вероятно, следует пересмотреть код механизма моделирования и переместить большие объекты в кучу. Проблема заключается в том, что движок обслуживается другим поставщиком, и я бы хотел, по возможности, не изменять его код.

Я думаю о создании своего собственного потока в DLL с большим размером стека и возвращении результатов вызывающему потоку после завершения вычисления. Это правильный подход?

Спасибо,
Michal

2

Решение

Я собираюсь предположить, что первый вы проверяете, сколько стекового пространства вы на самом деле используете. Вы размещаете большие объекты в стеке? Использует ли ваша программа значительную глубину рекурсии? Напишите тестовое приложение-ловушку, которое вы можете связать со своей DLL, и проверьте, сколько стекового пространства вы используете

Если вы размещаете большие объекты в стеке, я настоятельно рекомендую переместить их в кучу.

Если вы делаете значительную рекурсию, вы можете исследовать цикл с использованием стека на основе кучи, поддерживаемого вашей DLL, а не полагаться на стек приложения.

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

1

Другие решения

Visual Studio предоставляет два варианта изменения размера стека по умолчанию (1 МБ):

/ F для компилятора:
https://docs.microsoft.com/cpp/build/reference/f-set-stack-size

/ STACK для компоновщика:
https://docs.microsoft.com/cpp/build/reference/stack

0

По вопросам рекламы [email protected]