Russian Qt Forum
Ноябрь 24, 2024, 02:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: stack size в Visual Studio  (Прочитано 11406 раз)
niktagor
Гость
« : Сентябрь 28, 2010, 21:02 »

 Добрый день. Прошу прощения, если не в ту ветку. В компиляторах последнее сообщение просто датируется июлем. Пытаюсь объявить массив большого размера в Visual Studio. Программа вызывает ошибку, если размер больше 1 МБ. Мучение поиска привело к выводу, что нужно менять stack size проекта. Делаю все, как написано тут: http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx Но не помогает. Какие могут быть причины? Возможно, меня не только размер стека ограничивает?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 28, 2010, 21:07 »

Массив чего? Может через указатели сделать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex_cs_gsp
Гость
« Ответ #2 : Сентябрь 29, 2010, 07:33 »

Размер адресного пространства для стека действительно по-умолчанию 1Мб. При переполнении стека возникает исключение.  Можно использовать ключ компоновщика /STACK: [reserve],[commit], где reserve - объем виртуальной памяти (наибольший размер, который может иметь стек) commit -физической, которая изначально доступна.  Но этим злоупотреблять не нужно, лучше использовать динамическую память.
« Последнее редактирование: Сентябрь 29, 2010, 08:07 от Alex_cs_gsp » Записан
Anchorite
Гость
« Ответ #3 : Сентябрь 29, 2010, 08:32 »

Используй std::vector
Записан
niktagor
Гость
« Ответ #4 : Сентябрь 29, 2010, 10:58 »

 /STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта.
Записан
Alex_cs_gsp
Гость
« Ответ #5 : Сентябрь 29, 2010, 11:11 »

/STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта.

А код ошибки компиляции сказать можешь, чтобы не гадать? Никогда с таким не сталкивался, но по-видимому возможно, что если объявлен массив в стековой памяти с объектами совокупный sizeof которых более 1Мб, то компоновщик (или компилятор, не знаю) что-нибудь скажет.

« Последнее редактирование: Сентябрь 29, 2010, 11:16 от Alex_cs_gsp » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 29, 2010, 11:18 »

/STACK: [reserve],[commit] не помогло. Редактировал эти параметры в настройках проекта.
Неверным путем идете. Данные такого размера размещаются в куче или используются контейнеры (которые сами разместят в той же куче). Пример
Код
C++ (Qt)
// объявление
#define NUM_ELEM   (1000 * 1000)
QVector <double> myData;
myData.resize(NUM_ELEM);
// использование
myData[0] = 5.0;
 
Записан
niktagor
Гость
« Ответ #7 : Сентябрь 29, 2010, 18:34 »

 А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего!
Записан
spectre71
Гость
« Ответ #8 : Сентябрь 29, 2010, 18:49 »

А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего!

Естественно, что разнообразные библиотечные списки(векторы...) для ординарных случаев.
Ну так и выделяй в куче память под свой массив! Зачем тебе выделять на стеке?
Записан
Alex_cs_gsp
Гость
« Ответ #9 : Сентябрь 29, 2010, 19:10 »

     Нет я думал ради науки поиграться. А как вы думаете где стек потока находится - также в динамической памяти. Выделите большой кусок, какой вам нужен, а потом делите его как вам хочется, например, сделайте свой менеджер, перегрузив оператор new.
   Если стл, то используйте в векторе метод reserve, который резервирует память, пусть сразу выхватит из кучи памяти, сколько вам нужно. Насчет контейнеров не знаю, но вот алгоритмы stl точно тормозные, когда-то игрался с сортировками, так написанная мною быстрая сортировка и даже сортировка Шелла обходили библиотечную быструю, правда это от компилятора также зависит.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 29, 2010, 19:23 »

А если мне с этими данными высокопроизводительные вычисления делать нужно? Например БПФ на 4096 точек в реальном времени? Векторы все эти - от нечистого. Я хочу работать с данными по указателю. Неужели компьютер с 4ГБ оперативной памяти не может выделить в ней непрервный кусок размером 4МБ? Это ведь 0,1% всего!
Тогда так

Код
C++ (Qt)
double * myData = new double[NUM_DATA];
...
// когда использование закончено, нужно удалить
delete [] myData;
 

но вот алгоритмы stl точно тормозные, когда-то игрался с сортировками, так написанная мною быстрая сортировка и даже сортировка Шелла обходили библиотечную быструю, правда это от компилятора также зависит.
Я так понимаю дело было в MSVC в режиме debug и всем страхомудием включенным (ITERATOR_DEBUG и.т.д)  Улыбающийся
Записан
Alex_cs_gsp
Гость
« Ответ #11 : Сентябрь 30, 2010, 09:22 »

Я так понимаю дело было в MSVC в режиме debug и всем страхомудием включенным (ITERATOR_DEBUG и.т.д)  Улыбающийся

Ага, только я про алгоритмы, контейнеры не тестил. Использовал массивы, т.к. вместо итератора можно передать указатель.
« Последнее редактирование: Сентябрь 30, 2010, 09:24 от Alex_cs_gsp » Записан
niktagor
Гость
« Ответ #12 : Сентябрь 30, 2010, 10:50 »

Цитировать
double * myData = new double[NUM_DATA];
Спасибо, работает! А что при этом происходит? Создается обычный массив в непрерывном куске памяти? Или это какой-то C++ класс double со своими фишками? Я смогу с этим работать по указателю, вычисляя адрес как &MyData + N*sizeof(double)
Записан
Alex_cs_gsp
Гость
« Ответ #13 : Сентябрь 30, 2010, 11:49 »

Только не   &myData + N*sizeof(double), а myData + N. myData  - уже указатель на первый элемент массива. Для пользователя (программиста) память выглядит непрерывной, как на самом-деле неизвестно. Потом не забудьте удалить память. Советую прочитать какую-нибудь литературу по С++ или даже по Си.
« Последнее редактирование: Сентябрь 30, 2010, 13:50 от Alex_cs_gsp » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 30, 2010, 13:03 »

Цитировать
double * myData = new double[NUM_DATA];
Спасибо, работает! А что при этом происходит? Создается обычный массив в непрерывном куске памяти? Или это какой-то C++ класс double со своими фишками? Я смогу с этим работать по указателю, вычисляя адрес как &MyData + N*sizeof(double)
1) Это "экологически чистый" массив, скорость доступа такая же как для myData[NUM_ELEM].

2) Адресную арифметику надо подучить.
Код
C++ (Qt)
double * myData = new double[NUM_ELEM];
myData[4] = 5.0;         // указатель и есть массив
*(myData + 4) = 2.0;  // то же что и myData[4]
 
*(myData + 4 * sizeof(double)) = 1.0;   // а это уже myData[32]
 

3)
Для пользователя (программиста) память выглядит непрерывной, как на самом-деле неизвестно.
Имеется ввиду что современные ОС могут выделять больше памяти чем есть физически. Но это верно для любых распределений и совсем не значит что new "хуже". Есть небольшие расходы на само new/delete - но это (в данном случае) операция одноразовая
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 23.