Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локальные переменные создаются на стеке... ... но почему не в куче? 
:(
    Опции темы
КунгФуЧайник
Дата 5.12.2015, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Тогда бы, как я понимаю, и в замыканиях смысла не было.
Это из-за каких-то аппаратных ограничений?
PM MAIL   Вверх
borisbn
Дата 5.12.2015, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Господа, переведите, пожалуйста, на русский.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
КунгФуЧайник
Дата 5.12.2015, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



borisbn, не правильно сказал? Вроде же локальные переменные функций создаются в стеке. Хочу понять, почему в стеке, а не в куче.
PM MAIL   Вверх
Фантом
Дата 5.12.2015, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Словосочетание "скорость доступа" ни о чем не говорит?
PM   Вверх
КунгФуЧайник
Дата 5.12.2015, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Цитата(Фантом @  5.12.2015,  19:43 Найти цитируемый пост)
Словосочетание "скорость доступа" ни о чем не говорит? 

Это всего лишь словосочетание. Реализовано за счет чего? За счет стековых регистров в процессоре? В них хранятся все локальные переменные? А если переменных много - регистров же мало?
PM MAIL   Вверх
Alexeis
Дата 5.12.2015, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(КунгФуЧайник @  5.12.2015,  13:55 Найти цитируемый пост)
Тогда бы, как я понимаю, и в замыканиях смысла не было.
Это из-за каких-то аппаратных ограничений? 

  Ну как минимум была бы невозможна рекурсия. А вообще локальные переменные могут быть не в стеке, а в регистрах. Ну и экономия памяти. Память под стековые переменные выделятся в момент захода в подпрограмму и освобождается по выходу. Ну и по скольку стек интенсивно используется, то вполне вероятно, что он кешируется процессором. Так что доступ к этой памяти будет быстрее. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
feodorv
Дата 6.12.2015, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(Alexeis @  5.12.2015,  22:44 Найти цитируемый пост)
Ну как минимум была бы невозможна рекурсия.

Да уже простой вызов подпрограммы становится невозможным, так как неизвестно, в каком месте сохранять адрес аллокированного блока локальных переменных самой вызывающей подпрограммы.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 6.12.2015, 02:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Ну, в скриптовых языках память под локальные переменные может располагаться в куче - аппаратных стек используется интерпретатором. Но в обычной, компилируемой программе это не эффективно. Да и то, в стеке как минимум, будут адрес возврата, параметры или указатель на них, (указатель на) локальные переменные.
PM   Вверх
volatile
Дата 6.12.2015, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(КунгФуЧайник @  5.12.2015,  22:07 Найти цитируемый пост)
 За счет стековых регистров в процессоре? В них хранятся все локальные переменные? А если переменных много - регистров же мало? 

Там всего один стековый регистр, указывающий на вершину стека.
Сам стек располагается в памяти.

PM MAIL   Вверх
Alexeis
Дата 6.12.2015, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(feodorv @  6.12.2015,  01:59 Найти цитируемый пост)
Да уже простой вызов подпрограммы становится невозможным, так как неизвестно, в каком месте сохранять адрес аллокированного блока локальных переменных самой вызывающей подпрограммы. 

  Это детали реализации. Компилятор может зарезервировать для этих указателей фиксированные позиции, например в по отрицательному смещению от точки входа или в любом другом месте, про которое знает компилятор.
Цитата(volatile @  6.12.2015,  12:54 Найти цитируемый пост)
Там всего один стековый регистр, указывающий на вершину стека.
Сам стек располагается в памяти.

  Я думаю речь идет об оптимизации переменных в арифметических регистрах. Если подпрограмма небольшая, то для переменных может не понадобиться стек. Сложил несколько регистров и результат выдал в eax. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
volatile
Дата 6.12.2015, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Alexeis @  6.12.2015,  13:56 Найти цитируемый пост)
Я думаю речь идет об оптимизации переменных в арифметических регистрах. Если подпрограмма небольшая, то для переменных может не понадобиться стек

Если речь идет о таких подпрограммах, тогда топик не имеет смысла
Цитата(КунгФуЧайник @  5.12.2015,  12:55 Найти цитируемый пост)
Локальные переменные создаются на стеке... ... но почему не в куче?



PM MAIL   Вверх
КунгФуЧайник
Дата 6.12.2015, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.8.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  6.12.2015,  00:59 Найти цитируемый пост)
Да уже простой вызов подпрограммы становится невозможным, так как неизвестно, в каком месте сохранять адрес аллокированного блока локальных переменных самой вызывающей подпрограммы. 


Цитата(math64 @  6.12.2015,  02:29 Найти цитируемый пост)
 Да и то, в стеке как минимум, будут адрес возврата, параметры или указатель на них, (указатель на) локальные переменные. 


Понял так: есть
Регистры процессора
Стек + остальная оперативная память.

Стек - та же самая оперативная память, просто структурированная друг-за-другом (читал про стек, push-pop)? Тогда все равно не улавливаю разницы. Почему, например, рекурсия будет не возможна? Ведь что в стеке, что в обычной памяти - все лежит по адресам: запомнил адрес, куда нужно вернуть результат из подпрограммы - подпрограмма выполнилась - результат вернули по адресу. Вроде бы, все тоже самое, что со стеком, но нет "выхода из подпрограммы", в результате которого теряются все локальные переменные этой подпрограммы... Или в этом и разница - как располагается код: друг-за-другом или как попало (читал, в памяти может лежать где угодно - в зависимости, где ему место найдет)?

Это сообщение отредактировал(а) КунгФуЧайник - 6.12.2015, 21:14
PM MAIL   Вверх
math64
Дата 7.12.2015, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Вот структура памяти для ДОС (упрощенная, для винды и линукса немного сложнее, но принцип тот же)
Код

ДОС код операционной системы
.CODE - код программы
.DATA - глобальные переменные программы
куча
стек
БИОС - код в ПЗУ, загружающий операционную систему

Для выделния памяти в стеке, нужно просто передвинуть SP, при этом размер кучи уменьшается.
Для выделния памяти в куче нужно искать свободное место в ней.

В старых машинах (ЕС, не помню как назывался их американский прототип фирмы IBM) стека не было.
Место под локальные переменные выделялось в сегменте данных, рядом - место для сохранения адреса возврата.
В таких условиях рекурсия не возможна - при рекурсивном вызове даже память под адрес возврата будет занята.

В микропроцессорах типа 8051 стек есть, но команд, для обращения к нему нет, кроме PUSH и POP. В тоже время оперативной памяти мало, чтобы тратить её как делается в ЕС.
Вместо этого компилятор или линковщик строит дерево вызовов и распределяет память с оверлеем. При этом запрещена не только рекурсия, но и вызов функции по указателю.

Это сообщение отредактировал(а) math64 - 7.12.2015, 11:30
PM   Вверх
Alexeis
Дата 7.12.2015, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(КунгФуЧайник @  6.12.2015,  22:14 Найти цитируемый пост)
Почему, например, рекурсия будет не возможна?

  Если мы говорим об оптимизации памяти под замыкания, то предполагается, что локальные переменные для подпрограммы существуют и до входа в подпрограмму и после. Т.е. сохраняют свое состояние. При рекурсии же память под переменные выделяется всякий раз, когда происходит вызов. Т.е. при 10ти вложенностях у нас в стеке 10 копий локальных переменных. Таким образом не соблюдается соотношение, что у каждой подпрограммы свои локальные переменные, которые могли образовать замыкание.
  Не, ну в теории можно, конечно, выделять память в куче под переменные каждый раз при заходе в подпрограмму, тогда могла бы работать и рекурсия, но эффективность такого подхода была бы чрезвычайно низкой. Так могут работать только интерпретированные языки, но не С++, который ориентирован на максимальную производительность.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1239 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.