nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
|
|
#1 | |
Размер стэка и кучи - C++06.12.2013, 08:12. Просмотров 1166. Ответов 7
Метки нет Все метки)
(
Насколько я знаю, куча и стек растут в направлении друг-дружки в общей куче. Однако, я с удивление обнаружил, что выделить локальный массив на > миллиона элементов типа int нельзя, а в куче (new[]) можно. Выходит, стэк ограничен? Но почему? Его можно сделать динамических поигравшись с опциями компилятора? Или, быть может, динамический стек => динамическая куча (в смысле, когда границы её меняются тоже) = много хуже производительность и, поэтому, такое не практикуют?
Добавлено через 12 часов 4 минуты up-to-date?
0
|
|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
06.12.2013, 08:12 |
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Размер стэка и кучи (C++):
7
Размер кучи - C++ Размер бинарной кучи, процедура heapify - C++ Получать различные начала кучи при создании кучи внутри цикла - C++ Выйти за пределы стэка - C++ Переполнение стэка при рекурсии - C++ Стэк. Нужно определить, сколько элементов стэка, начиная с вершины, находятся до элемента с максимальным значениям - C++ |
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
|
|
06.12.2013, 10:16 | #2 |
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 |
Если вы будете вместо стека использовать динамическую память то ваше приложение будет тормозить. ибо при каждом вызове функции, при передаче параметров, и выходе из предела видимости вы будете дергать менеджер памяти (ему надо дать вам память, а потом отдать ее системе), а это чревато тормозами.
0
|
МаксимТ
47 / 47 / 4
Регистрация: 17.08.2012
Сообщений: 225
|
|
06.12.2013, 17:46 | #8 |
он меняется в пределах отведенного ему блока. но если сменится сам блок?
например ситуация когда за страницей стека выделена другая страница, а нам нужно уместить огромное число данных в стеке. расширить стек не получился изза наложения виртуальных адресов. а перенос его в другое виртуальное место - вызовет проблемы с адресами на прежний блок. (речь о других функциях, которые хранят свои данные в стеке и ничего не подозревают о том что стек динамический). можно конечно переписать функции, неоправданно увеличив код и понизив быстродействие. но оно надо? Добавлено через 2 минуты з.ы. под сменой стекового регистра я имел в виду смену самой страницы отведенной под стек, не так выразился
0
|
06.12.2013, 17:46 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
06.12.2013, 17:46 |
Привет! Вот еще темы с ответами:
8
Границы кучи - C++ Ошибка кучи - C++ Ошибка кучи - C++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |