Есть ли способ увеличить размер стека по умолчанию за пределы 16777216 байт?

Вопрос говорит обо всем. Попытка увеличить размер стека в опциях компоновщика приводит к ошибке:

Максимальный размер стека должен быть целым числом от 65536 до 16777216.

Является ли это ограничение в 16 МБ фундаментальным ограничением компилятора Delphi или это произвольное ограничение, налагаемое IDE? Есть ли другой способ увеличить это значение?

Примечание (в ожидании комментариев...):

  • Необходимость в большем стеке обусловлена ​​огромными статическими типами массивов, которые используются в качестве локальных переменных.
  • Я понимаю, что необходимость сделать это является симптомом ужасного дизайна
  • Это большое устаревшее приложение, за дизайн и обслуживание которого я не отвечаю.
  • Рефакторинг на динамические массивы работает, но снижает производительность на 50%.
  • Возможны другие рефакторинги - возможно, недели работы. Это, скорее всего, закончится как побочный проект.
  • Между тем, функциональность необходима сейчас, и больший стек будет легко исправить.
  • Да, я действительно, действительно знаю, это плохо, плохо.

2 ответа

Решение

Вы можете увеличить его до 2147483647, используя {$MAXSTACKSIZE} (или же {$M minstacksize maxstacksize} директива компилятора. Обратите внимание, что это другое использование для {$M} чем {$M+/-} используется для указания генерации RTTI для классов.

Из XE6 docwiki (это также относится и к предыдущим версиям):

Директива $M определяет параметры выделения стека приложения. minstacksize должно быть целым числом от 1024 до 2147483647, которое определяет минимальный размер стека приложения, а maxstacksize должно быть целым числом от minstacksize до 2147483647, которое указывает максимальный размер стека приложения.

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

Это ограничение Delphi IDE. Вы можете указать больший лимит, используя $MINSTACKSIZE а также$MAXSTACKSIZE директивы. Кажется странным, что дизайнеры IDE решили помешать вам делать что-то из IDE, что вы можете сделать из компилятора.

Обратите внимание, что изменение размера стека по умолчанию рискованно. Это повлияет на все стеки в вашем процессе, даже для потоков, не созданных вашим кодом. Таким образом, вы могли бы счесть более эффективным ограничить изменение только конкретным потоком. Это может быть достигнуто путем передачи размера стека в качестве параметра CreateThread,

Наконец, я уверен, что будет эффективное решение, которое не предполагает увеличения размера стека.

Другие вопросы по тегам