Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Размер стэка и кучи - C++

06.12.2013, 08:12. Просмотров 1032. Ответов 7
Метки нет (Все метки)

Насколько я знаю, куча и стек растут в направлении друг-дружки в общей куче. Однако, я с удивление обнаружил, что выделить локальный массив на > миллиона элементов типа int нельзя, а в куче (new[]) можно. Выходит, стэк ограничен? Но почему? Его можно сделать динамических поигравшись с опциями компилятора? Или, быть может, динамический стек => динамическая куча (в смысле, когда границы её меняются тоже) = много хуже производительность и, поэтому, такое не практикуют?

Добавлено через 12 часов 4 минуты
up-to-date?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 08:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размер стэка и кучи (C++):

Размер кучи - C++
С помощью какой библиотечной ф-ции или как узнать размер кучи в языке Си?

Размер бинарной кучи, процедура heapify - C++
Не могу понять, каким образом надо работать с параметром "размер кучи" при реализации сортировки пирамидой. В псевдокоде написано, что в...

Получать различные начала кучи при создании кучи внутри цикла - C++
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса (выбираются ОС) на начало кучи (периодические...

Выйти за пределы стэка - C++
Короче дали задание выйти за пределы стэка. Как переполнить стэк я знаю (запустить бесконечную рекурсивную функцию), но надо именно выйти...

Переполнение стэка при рекурсии - C++
вот код: #include <iostream> using namespace std; void Vvod (int *A, int n) { for (int i=0;i<n;i++) { cin>>A; ...

Стэк. Нужно определить, сколько элементов стэка, начиная с вершины, находятся до элемента с максимальным значениям - C++
У меня такая задачка: Определить структуру стэка и разработать функции, необходимые для роботы с заданным контейнером: ф-ию суммы элементов...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
06.12.2013, 10:16 #2
https://www.google.ru/#newwindow=1&q...83%D1%87%D0%B0
ваш кэп
0
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
06.12.2013, 10:17 #3
динамический стек приведет к частой смене регистра ESP, что как минимум недопустимо посередине функции,
т.к. функция может сохранять указатель на эту область, а она уже не валидная.
у каждой нити свой стек, ограниченый опред. размером(в винде 1 МБ по умолчанию).
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
06.12.2013, 16:28  [ТС] #4
МаксимТ, что-то не вижу логики. Стек, по сути, и так "динамический", просто ограничем верхним значением. Так что если вдруг в область стала невалидна в динамическом стеке, она стала бы невалидна и в обычном стеке (эта область бы по прежнему принадлежала стэку, но там не было бы данных).
А ESP то что? Это у нас указатель стека. Он почти всегда меняется.. любая локальная переменная заносится в стек, любой вызов функции заносится в стек и так далее.

Добавлено через 25 секунд
Kukurudza, вроде как в правилах запрещенно выдавать подобные ссылки в гугл.
Да и вопрос у меня не "что такое стек и куча?"
0
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
06.12.2013, 17:01 #5
окей, расскажу.
думаю понятно что куча гораздо медленнее стека. потому что когда вам нужна память вы зовете аллокатор памяти, а он в свою очередь долбит менеджера памяти и уже менеджер памяти ищет вам место и дает, если оно есть.
как написал максим, у вас на стеке есть 1мб памяти, и этого хватает за глаза. если вы хотите большой объект, выделяйте память динамически. далее. иногда просто нельзя хотеть большой стек. например вы говорите: пусть у меня будет стек размером сто мегабайт. а я в свою очередь говорю, а мне надо чтобы программа выполнялась в 32 потока. каждому потоку по 100 метров уже огого.
вы хотите большой стек? приведите разумный пример зачем вам это нужно.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
06.12.2013, 17:23  [ТС] #6
Kukurudza, иначе говоря, для того, чтобы можно было выделить каждому потоку по стеку, что не представляется возможным при динамическом размере??
0
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
06.12.2013, 17:37 #7
Если вы будете вместо стека использовать динамическую память то ваше приложение будет тормозить. ибо при каждом вызове функции, при передаче параметров, и выходе из предела видимости вы будете дергать менеджер памяти (ему надо дать вам память, а потом отдать ее системе), а это чревато тормозами.
Цитата Сообщение от Kukurudza Посмотреть сообщение
потому что когда вам нужна память вы зовете аллокатор памяти, а он в свою очередь долбит менеджера памяти и уже менеджер памяти ищет вам место и дает, если оно есть.
0
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
06.12.2013, 17:46 #8
Цитата Сообщение от nexen Посмотреть сообщение
А ESP то что? Это у нас указатель стека. Он почти всегда меняется.. любая локальная переменная заносится в стек, любой вызов функции заносится в стек и так далее.
он меняется в пределах отведенного ему блока. но если сменится сам блок?
например ситуация когда за страницей стека выделена другая страница, а нам нужно уместить огромное число данных в стеке.
расширить стек не получился изза наложения виртуальных адресов.
а перенос его в другое виртуальное место - вызовет проблемы с адресами на прежний блок.
(речь о других функциях, которые хранят свои данные в стеке и ничего не подозревают о том что стек динамический).
можно конечно переписать функции, неоправданно увеличив код и понизив быстродействие. но оно надо?

Добавлено через 2 минуты
з.ы. под сменой стекового регистра я имел в виду смену самой страницы отведенной под стек, не так выразился
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 17:46
Привет! Вот еще темы с ответами:

Повреждние кучи - C++
Понимаю, тема стара как мир, но похожих случаев не нашел, к сожалению. Есть консольное приложение, в котором реализуется СУБД библиотеки...

Границы кучи - C++
Как корректно определить границы кучи в любой момент времени без использования функций менеджера дрп в си? Добавлено через 18 часов 7...

Ошибка кучи - C++
Здравствуйте, уважаемые программисты. Возникла у меня такая проблема: Задали сделать курсовую работу на С++ через MFC. Суть задачи: В...

Ошибка кучи - C++
Выдает ошибку: "ОС Windows инициировала точку останова в Lab2.exe.Это может быть вызвано повреждением кучи и указывает на ошибку в Lab2.exe...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.12.2013, 17:46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru