Название: stack size в Visual Studio Отправлено: niktagor от Сентябрь 28, 2010, 21:02 Добрый день. Прошу прощения, если не в ту ветку. В компиляторах последнее сообщение просто датируется июлем. Пытаюсь объявить массив большого размера в Visual Studio. Программа вызывает ошибку, если размер больше 1 МБ. Мучение поиска привело к выводу, что нужно менять stack size проекта. Делаю все, как написано тут: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx Но не помогает. Какие могут быть причины? Возможно, меня не только размер стека ограничивает?
Название: Re: stack size в Visual Studio Отправлено: Пантер от Сентябрь 28, 2010, 21:07 Массив чего? Может через указатели сделать?
Название: Re: stack size в Visual Studio Отправлено: Alex_cs_gsp от Сентябрь 29, 2010, 07:33 Размер адресного пространства для стека действительно по-умолчанию 1Мб. При переполнении стека возникает исключение. Можно использовать ключ компоновщика /STACK: [reserve],[commit], где reserve - объем виртуальной памяти (наибольший размер, который может иметь стек) commit -физической, которая изначально доступна. Но этим злоупотреблять не нужно, лучше использовать динамическую память.
Название: Re: stack size в Visual Studio Отправлено: Anchorite от Сентябрь 29, 2010, 08:32 Используй std::vector
Название: Re: stack size в Visual Studio Отправлено: niktagor от Сентябрь 29, 2010, 10:58 /STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта.
Название: Re: stack size в Visual Studio Отправлено: Alex_cs_gsp от Сентябрь 29, 2010, 11:11 /STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта. А код ошибки компиляции сказать можешь, чтобы не гадать? Никогда с таким не сталкивался, но по-видимому возможно, что если объявлен массив в стековой памяти с объектами совокупный sizeof которых более 1Мб, то компоновщик (или компилятор, не знаю) что-нибудь скажет. Название: Re: stack size в Visual Studio Отправлено: Igors от Сентябрь 29, 2010, 11:18 /STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта. Неверным путем идете. Данные такого размера размещаются в куче или используются контейнеры (которые сами разместят в той же куче). ПримерКод
Название: Re: stack size в Visual Studio Отправлено: niktagor от Сентябрь 29, 2010, 18:34 А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего!
Название: Re: stack size в Visual Studio Отправлено: spectre71 от Сентябрь 29, 2010, 18:49 А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего! Естественно, что разнообразные библиотечные списки(векторы...) для ординарных случаев. Ну так и выделяй в куче память под свой массив! Зачем тебе выделять на стеке? Название: Re: stack size в Visual Studio Отправлено: Alex_cs_gsp от Сентябрь 29, 2010, 19:10 Нет я думал ради науки поиграться. А как вы думаете где стек потока находится - также в динамической памяти. Выделите большой кусок, какой вам нужен, а потом делите его как вам хочется, например, сделайте свой менеджер, перегрузив оператор new.
Если стл, то используйте в векторе метод reserve, который резервирует память, пусть сразу выхватит из кучи памяти, сколько вам нужно. Насчет контейнеров не знаю, но вот алгоритмы stl точно тормозные, когда-то игрался с сортировками, так написанная мною быстрая сортировка и даже сортировка Шелла обходили библиотечную быструю, правда это от компилятора также зависит. Название: Re: stack size в Visual Studio Отправлено: Igors от Сентябрь 29, 2010, 19:23 А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего! Тогда такКод
но вот алгоритмы stl точно тормозные, когда-то игрался с сортировками, так написанная мною быстрая сортировка и даже сортировка Шелла обходили библиотечную быструю, правда это от компилятора также зависит. Я так понимаю дело было в MSVC в режиме debug и всем страхомудием включенным (ITERATOR_DEBUG и.т.д) :)Название: Re: stack size в Visual Studio Отправлено: Alex_cs_gsp от Сентябрь 30, 2010, 09:22 Я так понимаю дело было в MSVC в режиме debug и всем страхомудием включенным (ITERATOR_DEBUG и.т.д) :) Ага, только я про алгоритмы, контейнеры не тестил. Использовал массивы, т.к. вместо итератора можно передать указатель. Название: Re: stack size в Visual Studio Отправлено: niktagor от Сентябрь 30, 2010, 10:50 Цитировать double * myData = new double[NUM_DATA]; Спасибо, работает! А что при этом происходит? Создается обычный массив в непрерывном куске памяти? Или это какой-то C++ класс double со своими фишками? Я смогу с этим работать по указателю, вычисляя адрес как &MyData + N*sizeof(double)Название: Re: stack size в Visual Studio Отправлено: Alex_cs_gsp от Сентябрь 30, 2010, 11:49 Только не &myData + N*sizeof(double), а myData + N. myData - уже указатель на первый элемент массива. Для пользователя (программиста) память выглядит непрерывной, как на самом-деле неизвестно. Потом не забудьте удалить память. Советую прочитать какую-нибудь литературу по С++ или даже по Си.
Название: Re: stack size в Visual Studio Отправлено: Igors от Сентябрь 30, 2010, 13:03 Цитировать double * myData = new double[NUM_DATA]; Спасибо, работает! А что при этом происходит? Создается обычный массив в непрерывном куске памяти? Или это какой-то C++ класс double со своими фишками? Я смогу с этим работать по указателю, вычисляя адрес как &MyData + N*sizeof(double)2) Адресную арифметику надо подучить. Код
3) Для пользователя (программиста) память выглядит непрерывной, как на самом-деле неизвестно. Имеется ввиду что современные ОС могут выделять больше памяти чем есть физически. Но это верно для любых распределений и совсем не значит что new "хуже". Есть небольшие расходы на само new/delete - но это (в данном случае) операция одноразовая |