![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
КунгФуЧайник |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.8.2011 Репутация: нет Всего: нет |
Тогда бы, как я понимаю, и в замыканиях смысла не было.
Это из-за каких-то аппаратных ограничений? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Господа, переведите, пожалуйста, на русский.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
КунгФуЧайник |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.8.2011 Репутация: нет Всего: нет |
borisbn, не правильно сказал? Вроде же локальные переменные функций создаются в стеке. Хочу понять, почему в стеке, а не в куче.
|
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
Словосочетание "скорость доступа" ни о чем не говорит?
|
|||
|
||||
КунгФуЧайник |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.8.2011 Репутация: нет Всего: нет |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Ну как минимум была бы невозможна рекурсия. А вообще локальные переменные могут быть не в стеке, а в регистрах. Ну и экономия памяти. Память под стековые переменные выделятся в момент захода в подпрограмму и освобождается по выходу. Ну и по скольку стек интенсивно используется, то вполне вероятно, что он кешируется процессором. Так что доступ к этой памяти будет быстрее. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Да уже простой вызов подпрограммы становится невозможным, так как неизвестно, в каком месте сохранять адрес аллокированного блока локальных переменных самой вызывающей подпрограммы. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ну, в скриптовых языках память под локальные переменные может располагаться в куче - аппаратных стек используется интерпретатором. Но в обычной, компилируемой программе это не эффективно. Да и то, в стеке как минимум, будут адрес возврата, параметры или указатель на них, (указатель на) локальные переменные.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Это детали реализации. Компилятор может зарезервировать для этих указателей фиксированные позиции, например в по отрицательному смещению от точки входа или в любом другом месте, про которое знает компилятор.
Я думаю речь идет об оптимизации переменных в арифметических регистрах. Если подпрограмма небольшая, то для переменных может не понадобиться стек. Сложил несколько регистров и результат выдал в eax. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Если речь идет о таких подпрограммах, тогда топик не имеет смысла
|
||||
|
|||||
КунгФуЧайник |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.8.2011 Репутация: нет Всего: нет |
Понял так: есть Регистры процессора Стек + остальная оперативная память. Стек - та же самая оперативная память, просто структурированная друг-за-другом (читал про стек, push-pop)? Тогда все равно не улавливаю разницы. Почему, например, рекурсия будет не возможна? Ведь что в стеке, что в обычной памяти - все лежит по адресам: запомнил адрес, куда нужно вернуть результат из подпрограммы - подпрограмма выполнилась - результат вернули по адресу. Вроде бы, все тоже самое, что со стеком, но нет "выхода из подпрограммы", в результате которого теряются все локальные переменные этой подпрограммы... Или в этом и разница - как располагается код: друг-за-другом или как попало (читал, в памяти может лежать где угодно - в зависимости, где ему место найдет)? Это сообщение отредактировал(а) КунгФуЧайник - 6.12.2015, 21:14 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вот структура памяти для ДОС (упрощенная, для винды и линукса немного сложнее, но принцип тот же)
Для выделния памяти в стеке, нужно просто передвинуть SP, при этом размер кучи уменьшается. Для выделния памяти в куче нужно искать свободное место в ней. В старых машинах (ЕС, не помню как назывался их американский прототип фирмы IBM) стека не было. Место под локальные переменные выделялось в сегменте данных, рядом - место для сохранения адреса возврата. В таких условиях рекурсия не возможна - при рекурсивном вызове даже память под адрес возврата будет занята. В микропроцессорах типа 8051 стек есть, но команд, для обращения к нему нет, кроме PUSH и POP. В тоже время оперативной памяти мало, чтобы тратить её как делается в ЕС. Вместо этого компилятор или линковщик строит дерево вызовов и распределяет память с оверлеем. При этом запрещена не только рекурсия, но и вызов функции по указателю. Это сообщение отредактировал(а) math64 - 7.12.2015, 11:30 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Если мы говорим об оптимизации памяти под замыкания, то предполагается, что локальные переменные для подпрограммы существуют и до входа в подпрограмму и после. Т.е. сохраняют свое состояние. При рекурсии же память под переменные выделяется всякий раз, когда происходит вызов. Т.е. при 10ти вложенностях у нас в стеке 10 копий локальных переменных. Таким образом не соблюдается соотношение, что у каждой подпрограммы свои локальные переменные, которые могли образовать замыкание. Не, ну в теории можно, конечно, выделять память в куче под переменные каждый раз при заходе в подпрограмму, тогда могла бы работать и рекурсия, но эффективность такого подхода была бы чрезвычайно низкой. Так могут работать только интерпретированные языки, но не С++, который ориентирован на максимальную производительность. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |