Как увеличить размер стека visual studio
Я пытался ознакомиться с станд :: нить библиотека в C ++ 11, и наткнулся на камень преткновения.
Первоначально я пришел из фонового потока posix, и мне было интересно, как можно настроить размер стека std :: thread перед сборкой, так как я не могу найти никаких ссылок на выполнение такой задачи.
Использование pthreads для установки размера стека выполняется следующим образом:
Есть ли что-то подобное при использовании станд :: нить?
Я использовал следующую ссылку:
Решение
Первоначально я пришел из фонового потока posix, и мне было интересно, как можно настроить размер стека std :: thread перед сборкой, так как я не могу найти никаких ссылок на выполнение такой задачи.
Ты не можешь std::thread не поддерживает это, потому что std::thread стандартизирован, и C ++ не требует, чтобы у машины был даже стек, а тем более стек фиксированного размера.
pthreads более строгие с точки зрения аппаратного обеспечения, которое они поддерживают, и предполагается, что для каждого потока существует некоторый фиксированный размер стека. (Так что вы можете настроить это)
Другие решения
Как уже сказал Локи Астари, крайне редко требуется размер стека, отличный от заданного по умолчанию, и обычно это либо ошибка, либо результат неправильного кодирования.
Если вы чувствуете, что размер стека по умолчанию слишком велик для ваших нужд и хотите его уменьшить, просто забудьте об этом. В каждой современной ОС теперь используется фиксация виртуальной памяти / по требованию, что означает, что память зарезервирована, а не фактически выделена, до тех пор, пока вы не получите доступ к страницам. Уменьшение размера стека не уменьшить ваш фактический объем памяти.
Из-за такого поведения ОС могут устанавливать размер стека по умолчанию на очень большие значения. Например. на ванильном Debian это 8МБ ( ulimit -s ) которого должно хватить на все нужды. Если вам все-таки удастся достичь этого предела, моя первая идея будет заключаться в том, что ваш код неправильный, поэтому вы должны в первую очередь просмотреть его и переместить все в кучу, преобразовать рекурсивные функции в циклы и т. Д.
Если несмотря на все это вы действительно очень необходимо изменить размер стека (т.е. увеличить его, так как уменьшать его бесполезно), в POSIX вы всегда можете использовать setrlimit в начале вашей программы, чтобы увеличить размер стека по умолчанию. Конечно, это повлияет на все потоки, но только те, кому это нужно, будут фактически использовать дополнительную память.
И последнее, но не менее важное: я могу видеть в угловом случае, когда уменьшение размера стека имеет смысл: если у вас есть тонны потоков в 32-битной системе, они могут поглотить ваше виртуальное адресное пространство (опять же, не фактическую память). потребления) до такой степени, что вам не хватает доступного адресного пространства для кучи. Снова, setrlimit Ваш друг здесь, хотя я бы посоветовал перейти на 64-битную систему, чтобы извлечь выгоду из большего виртуального адресного пространства (и если ваша программа так велика, вы, вероятно, также выиграете от дополнительной оперативной памяти).
Я также изучал эту проблему. Для некоторых приложений размер стека по умолчанию не подходит. Примеры: программа выполняет глубокую рекурсию в зависимости от конкретной проблемы, которую она решает; Программа должна создавать много потоков, и потребление памяти является проблемой.
Вот краткое изложение (частичных) решений / обходных путей, которые я нашел:
- G ++ поддерживает -fsplit-stack вариант на линуксе. Увидеть Для получения дополнительной информации о сплит стеки. Вот резюме с их сайта:
Цель разделения стеков состоит в том, чтобы позволить непрерывный стек, который
выращивается автоматически по мере необходимости. Это означает, что вы можете запустить несколько
потоки, каждый из которых начинается с небольшого стека, и имеет стек расти и
сжать в соответствии с требованиями программы.
Примечание: -fsplit-stack работал только для меня после того, как я начал использовать золотой линкер .
Кажется, Clang ++ также будет поддерживать этот флаг. Версия, которую я пробовал (clang ++ 3.3), потерпела крах при попытке скомпилировать мое приложение, используя флаг -fsplit-stack ,
В Linux установите размер стека, выполнив ulimit -s перед запуском вашей заявки. size размер стека в килобайтах Замечание: команда unlimit -s unlimited не влияет на размер потоков, созданных с std::thread , Когда я использовал ulimit -s unlimited , основной поток может расти, но потоки, созданные с std::thread имел размер по умолчанию.
В Windows, используя Visual Studio, мы можем использовать использовать компоновщик /STACK параметр или /STACKSIZE в файле определения модуля это размер по умолчанию для всех созданных потоков. Увидеть эта ссылка для дополнительной информации. Мы также можем изменить этот параметр в любом исполняемом файле, используя инструмент командной строки Editbin .
В Windows, используя mingw g ++, мы можем использовать опцию -Wl,--stack, , По какой-то причине при использовании cygwin g ++ этот флаг влияет только на размер основного потока.
Подходит, что сделал не работает для меня
ulimit -s на OSX. Это влияет только на размер основного потока. Более того, по умолчанию для Mac OSX размер стека pthread составляет 512 КБ.
setrlimit влияет только на размер основного потока в Linux и OSX. На cygwin у меня никогда не получалось, кажется, всегда возвращает ошибку.
Для OSX, кажется, единственная альтернатива boost::thread вместо std::thread , но это нехорошо, если мы хотим придерживаться стандарта. Я надеюсь, что g ++ и clang ++ также будут поддерживать -fsplit-stack на OSX в будущем.
Я нашел это в книге Скотта Мейерса Overview of the New C++(C++0x) , так как это довольно долго, я не могу опубликовать это как комментарий, это полезно?
Существует также стандартный API для доступа к платформе
обрабатывает потоки, мьютексы, условные переменные и т. д.
предполагается, что дескрипторы являются механизмом установки приоритетов потоков,
установка размеров стека и т. д. (Что касается установки размеров стека, Энтони
Уильямс отмечает: «Из тех ОС, которые поддерживают установку размера стека,
все они делают это по-разному. Если вы кодируете для конкретной платформы
(такой, что использование native_handle будет в порядке), тогда вы можете использовать
средства этой платформы для переключения стеков. например на POSIX вы могли бы
используйте makecontext и swapcontext вместе с явным выделением
стек, и в Windows вы можете использовать волокна. Затем вы можете использовать
специфичные для платформы средства (например, флаги компоновщика) для установки значения по умолчанию
размер стека до чего-то действительно крошечного, а затем переключите стеки в
что-то большее, где это необходимо. «)
Сам искал ответ на этот вопрос только сейчас.
Похоже, что пока std :: thread не поддерживает это, boost :: thread это делает.
В частности, вы можете использовать повышение :: Thread :: атрибуты чтобы сделать это:
Доброго времени суток! Прошу помочь мне со следующей проблемой:
У меня описаны константы:
И есть класс NeuronHidden
И еще один класс NeuronNet
При указанных константах, все компилируется и отлично работает.
Но мне необходимо N=2704 и K=1352, а при таких значениях программа компилируется, но при попытке создать экземпляр объекта выдает ошибку
"Необработанное исключение в "0x0041d367" в "NeuronNet1.exe": 0xC00000FD: Stack overflow."
и студия выдает файл с асемблерным кодом:
где подчеркивает строку test dword ptr [eax],eax ; probe page.
Как я понял стек переполняется, а что с этим можно сделать? Как увеличить размер стека? Пишу в Visual Studio C++.
3 ответа 3
Делай массив в куче
Можно сделать так:
- Увеличить размер стека, но..
- лучше размещать объекты в куче, например, с помощью контейнера std::vector. Тогда сможете делать нейронную сеть любого масштаба.
Приведённый тобой код можно вообще не менять. Экземпляры NeuronNet нужно создавать в динамической памяти, а не на стеке. То есть
Таким образом, ты создашь всю нейронную сеть в одном большом блоке памяти. Это работает быстрее, чем создание тысяч маленьких массивов, как тебе предложили.
1.Для большого блока памяти требуется один большой непрерывный диапазон виртуальных адресов, что и хорошо, если такой блок создается один раз вначале работы программы, но и плохо, если приходится делать это многократно и несколько раз. 2. Т.к. данные в блоке содержатся разноразмерные, то, скорее всего, возникнут проблемы с выравниваем, что скажется на производительности.
А зачем? Насчет быстрее - очень сомнительно Предолженый мною вариант, думаю, придаст гибкость системе. Можно объект размещать где угодно.
>Для большого блока памяти требуется один большой непрерывный диапазон виртуальных адресов, что и хорошо, если такой блок создается один раз вначале работы программы, но и плохо, если приходится делать это многократно и несколько раз. В его случае это около 30 МБ. Разве это так много? >Т.к. данные в блоке содержатся разноразмерные, то, скорее всего, возникнут проблемы с выравниваем, что скажется на производительности. Какие проблемы с выравниванием, если у него одни double? >А зачем? Насчет быстрее - очень сомнительно Быстрее само выделение. Само использование не ускорится.
Всем спасибо! За идею, я просто не придумал ничего умнее чем -увеличить стек. Когда сделал через указатели на объекты нейронов, то N можно было увеличить уже до 2000 тысяч, а потом опять ошибка. Решил запихнуть в кучу всю сеть, все равно ведь она создается один раз при запуске программы, стало возможным задавать любое N. Зашел сюда и собственно это и прочитал, только я не удалял. А что будет если не удалить? В оперативной памяти будет валяться занятый кусок, который сотрется при выключении питания?
>А что будет если не удалить? В оперативной памяти будет валяться занятый кусок, который сотрется при выключении питания? При выходе из программы вся память процесса по-любому освобождается, но если у объекта есть деструкторы, они не вызовутся без delete. Но всё-равно считается плохим тоном программирования не освобождать ненужную память.
Как решить проблему размера стека в Visual Studio (запуск кодов C с большим массивом)
Я чувствую, что проблема с размером стека.
В ссылке подробное объяснение (как указано ниже) я видел команду "ulimit", используемую в среде linux для увеличения размера стека. Я помню, как использовал его несколько лет назад.
Я чувствую, что мы близки к решению, но моя проблема с Windows (и VS 2013) сохраняется, поскольку мне не удалось выполнить dumpbin /headers executable_file или editbin /STACK:size . На самом деле я чувствую, что не знаю, как их выполнить. Я пытался выполнить их из "Developer Command Prompt VS 13", а также с помощью "Выполнить" (запуск Windows снизу -> поиск (запуск) -> Выполнение (поддержка вверх)). Я прошу вас предоставить более подробную информацию, если это возможно.
Я искал и нашел этот сайт и думаю, что здесь можно найти решение.
Пожалуйста помоги. Я хочу запустить с помощью Visual Studio 13 из Windows.
Я возвращаюсь к программированию после того, как ничего не делал в течение нескольких лет, и создал игру судоку, чтобы снова намочить ноги. Я написал рекурсивную функцию для грубого решения, и она будет делать это для простых состояний платы, но в большинстве случаев сталкивается с переполнением стека для более сложных состояний платы. Я знаю, что это можно предотвратить с помощью циклов или более эффективного алгоритма, но поскольку это ради обучения, я хочу знать, как выделить больше памяти для стека (признавая, что это не лучшее решение проблемы).
Другое решение рекомендует использовать EDITBIN.EXE, но я новичок в Visual Studio и не нашел объяснения, как я понимаю, как это сделать.
Точно так же я обнаружил, что вы можете использовать файл .def, чтобы указать больший размер стека по умолчанию, но не нашел объяснения, которое я понимаю, как его создать /реализовать.
Может ли кто-нибудь предложить объяснения уровня новичка в реализации файлов EDITBIN.EXE или .def или предложить другой способ увеличения размера стека?
2 ответа
Большое плохое предупреждение
Если вы используете рекурсию в программе и достигли точки, когда наличие StackOverflowException является реальной угрозой, пожалуйста, не рассматривайте увеличение размера стека как допустимое решение.
Если вы сталкиваетесь с StackOverflowException, вы делаете что-то очень неправильное; вместо этого вы должны использовать Stack для обработки в глубину или Queue для обработки в ширину. Пример.
Решение
Этого можно добиться с помощью editbin.exe , который устанавливается вместе с этим пакетом;
Найдите местоположение editbin.exe , шахта находилась в C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\bin\Hostx64\x64\editbin.exe , я бы предложил использовать все от voidtools вместо ужасного поиска Microsoft, чтобы найти это .
Установите размер стека вручную
Перейдите в папку bin и выполните следующее:
Например, я выполнил это:
Который устанавливает резервный размер стека равным 2 МБ.
Благодаря этому я смог достичь уровня рекурсии в два раза; (Резерв стека 1 МБ слева, резерв стека 2 МБ справа).
Установите размер стека автоматически
Щелкните правой кнопкой мыши свой проект и выберите «Параметры», затем нажмите «События сборки» и добавьте следующее к событиям после сборки:
Например, я добавил
Это будет запускать editbin.exe каждый раз, когда вы создаете свой исполняемый файл.
Примечание: вы увидите гораздо меньший уровень рекурсии, достигнутый при запуске вашей программы из Visual Studio, чем при ее явном запуске через проводник или cmd. Однако вы все равно увидите увеличение уровня рекурсии в 2 раза при переходе от резерва стека в 1 МБ к резерву стека в 2 МБ.
Возможно, установите резервный размер стека в Visual Studio:
Проект -> Свойства -> Свойства конфигурации -> Линкер -> Система -> Резервный размер стека
Это также можно сделать через командную строку или программно при создании потока:
Увеличение стека!
У меня в программе много рекурсивных функций. Я так понял из за того, что я много раз их вызываю переполняется стек. Если долго не пользоваться программой, то всё ок.
"Cannot evaluate expression because the current thread is in a stack overflow state."
Подскажите пожалуйста как и где увеличить стек.
Увеличение картинки
Пытаюсь увеличить картинку в pictureBox1 крутя trackBar1 private void trackBar1_Scroll(object.
Плавное увеличение
Добрай вечер! Как средствами WPF можно плавно увеличить размер окна(Как например при копировании в.
Увеличение массива
Змейка, постоянно увеличивается , при съедании груши, искал в интернете не знаю как задать вопрос.
увеличение массива
Доброе время суток! Пишу код, при компелировании выдаёт ошибку. .
Решение
Может стоит просто объезжать стены?)
тобишь не делать рекурсию там где она неприменима
Насколько я знаю расширить нельзя, можно оптимизировать код под рекурсию — передавать все структуры по ссылкам, вынести все лишнее из методов и сократить глубину самой рекурсии
Посижу ещё, может чё то получится. Просто я не понимаю из за чего это происходит
Решение
[JB], увеличить размер стека можно, по умолчанию он равен 4мб. Сделать это можно например с помощью CFF Explorer, там тебе нужно перейти в раздел Optional Header и найти параметр SizeOfStackCommit, он и отвечает за размер стека для приложения, с ним и экспериментируй.
Ну либо еще как вариант, сделать чисто по программистски — самому прочитать Optional Header (для этого нужно почитать о структуре Portable Executable (PE)) и изменить значение SizeOfStackCommit, но это по программистски (Лучше 1й вариант — меньше времени потратишь).
Но самый лучший вариант был предложен m0nax — пересмотри алгоритм, т.к. увеличение стека может и не помочь.
Как можно увеличить максимальный объем памяти, выделяемый в стеке / куче для программы на C ++?
Будет ли увеличение оперативной памяти вашего компьютера автоматически увеличивать объем стека / кучи памяти компьютерной программы?
Решение
Другие решения
Вы можете указать зарезервированный размер кучи и размер стека с помощью параметров ссылок / Куча и / Стек в Visual Studio. Для получения дополнительной информации проверьте эти статьи MSDN:
Второе редактирование: Из вашего комментария я вижу, что вы работаете в Windows, поэтому мой ответ по Unix, приведенный ниже, не будет для вас очень полезным. Но смотри Определение стекового пространства с помощью Visual Studio а также C / C ++ максимальный размер стека программы .
стек Размер часто ограничен в Linux. Команда ulimit -s выдаст текущее значение в килобайтах. Вы можете изменить значение по умолчанию (обычно) в файле /etc/security/limits.conf.
Вы также можете, в зависимости от привилегий, изменить его для каждого отдельного процесса, используя setrlimit() , Смотри например мой ответ в Ошибка сегментации: выделение стека в программе на C в Ubuntu при буферизации>4M .
За куча, см. например Ограничение размера кучи в C . Но я не верю, что вы можете увеличить или уменьшить максимальный размер.
Размер кучи процесса обычно ограничен максимальной памятью, которую процесс может выделить. Куча не обязательно должна быть смежной (если вы не делаете что-то вроде malloc (1000000000)), чтобы куча могла использовать большую часть доступного адресного пространства.
В Windows максимальный размер процесса зависит от нескольких факторов.
При использовании 32-битной Windows 32-битный процесс может по умолчанию выделить 2 ГБ.
Если Windows загружается с помощью параметра / 3GB, а процесс компилируется с использованием флага компоновщика «Включить большие адреса», то процесс может выделить 3 ГБ.
При использовании 64-битной Windows 32-битный процесс по умолчанию может выделить 2 ГБ.
Если процесс связан с «Включить большие адреса», то 64-разрядная Windows позволяет 32-разрядному процессу выделять 4 ГБ.
64-битный процесс (в 64-битной Windows) может выделить что-то вроде 16 000 ГБ.
У меня возникли проблемы с памятью с кучей по умолчанию и резервным размером стека 1 МБ. Но когда я установил выше свойства 2 МБ (2000000), он работает нормально.
Чтобы установить эти свойства в среде разработки Visual Studio, выполните следующие действия.
Увеличить размер стека
Как? В с++ проекте в свойствах легко менял значение, потом компилил - все работало. Щас пишу тоже.
Увеличить размер перебираемой строки
Всем привет, есть прога, которая делает перебор символов с определенной длиной в строку, есть.
Как искуственно увеличить размер программы?
Ув. гуру. Подскажите, пожалуйста, как сделать размер приложения больше по размеру? Вроде как.
Увеличить размер массива не удаляя элементы?
Приветствую, вот хотел бы просить что собственно делает array.Resize? как я понял эта функция.
- Воспользуйтесь кучей вместо стека;
- Можно создать отдельный поток, т.к. в конструкторе присутствует свойство maxStackSize.
Рекурсия закончится, я даже условие для этого специально написал, она выполняется примерно 12000 раз, потом стек переполняется. Если не трудно, опишите любой из вышеприведенных вами методов.
Nextus, я сам попробовал увеличить размер стека вторым способом, но у меня не вышло. Видимо, выхожу за границу максимально допустимого размера.
Первым способом будет, конечно, правильнее и проще. Но это надо смотреть код. Есть возможность его показать?
Вообщем это прога, решающая задачу о расстановке 8 ферзей на шахматной доске всеми способами, т.е. сумма в каждом направлении должна быть 1, а общая сумма матрицы 8.
Решение
Nextus, ооохх!
Первое. Вот видите, написали программу - зразу стало понятнее.
Так у Вас стек вызовов переполнен! 5000 раз рекурсия идет, а потом стек вызовов забит! Я думал, у Вас стек "локальными" переменными забит!
Второе. Один простой банальный вопрос: А зачем Вам вообще нужна рекурсия? У Вас функция никаких параметров не принимает, ничего не возвращает, и Вы просто в конце функции повторяете эту же функцию - сохраняя адрес в стеке вызовов, тем самым забивая его!
У Вас стоит условие 12 500 раз вызывать эту функцию. Просто вынесите ее в цикл, и крутите сколько нужно:
И запомните: рекурсия, это Вам не шуточки Ее нужно применять только тогда, когда она Вам реально нужна, а не потому что Вам захотелось вызывать одну и ту же функцию через этот прекрасный инструмент "рекурсия"! Наоборот, лучше искать способы НЕ использовать ее. В Вашей задаче нет потребности использовать ее
Читайте также: