187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

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

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

Добавлено через 12 часов 4 минуты
up-to-date?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2013, 08:12
Ответы с готовыми решениями:

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

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

Получать различные начала кучи при создании кучи внутри цикла
Можно ли как-то такое провернуть, чтобы на каждой итерации цикла получались различные адреса...

Как указать размер стэка в мб для программы на qt?
Как указать размер стека в мб для программы на qt? CMakeLists.txt. .pro файл.

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

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

Добавлено через 2 минуты
з.ы. под сменой стекового регистра я имел в виду смену самой страницы отведенной под стек, не так выразился
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2013, 17:46
Помогаю со студенческими работами здесь

Размер кучи
Доброго времени суток Подскажите пожалуйста, почему если снять комментарии со строк(обратиться к...

Размер кучи в TP70
Добрый день. Программе, написанной на ТР70, не хватает динамической памяти. Стал копаться, вставил...

Как узнать размер оставшейся кучи в stm32?
Заголовок передает всю суть вопроса, как узнать размер оставшейся кучи в stm32? Необходимо узнать...

Turbo Vision: на сколько уменьшится размер кучи в результате выполнения кода?
На сколько уменьшится размер кучи в результате выполнения оператора?...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru