Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  02:27[Войти] | [Зарегистрироваться]
Ответ на вопрос № 48373

12-01-2007 23:06
Вот часто слышно: переменные/данные располагаются в стеке, переменные/данные располагаются в куче, память выделяется там и там...
Со стеком я более или менее разобрался, а вот что такое эта "куча", для чего она служит и, самое главное, ГДЕ она располагается в адресном пространстве процесса, относительно того же стека или секции кода, а также секции данных (как последняя с ним связана и какие именно данные лежат в Ней?)?
И такой вопрос: куда попадают локальные переменные в программе (в стек, правильно?), а вот куда Глобальные, в какую из вышеперечисленных сущностей?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

14-01-2007 00:04 | Комментарий к предыдущим ответам
Хорошо бы эту микролекцию в Лицей поместить.

Уже без меня поместили :) Только не в Лицей, а в список offtopic-вопросов. А для Лицея это никак не подходит - в Лицее публикуются ЦИКЛЫ статей.

13-01-2007 10:10 | Комментарий к предыдущим ответам
то Антон Григорьев
Хорошо бы эту микролекцию в Лицей поместить.

13-01-2007 06:03
Я вам советую Рихтера почитать, у него хорошо описана структура виртуальной памяти в Windows и много чего другого.

http://www.zipsites.ru/books/effektivnye_win32_pril/

13-01-2007 05:14 | Сообщение от автора вопроса
Спасибо, Антон! Теперь всё становится на свои места.
Некоторые дополнения: строковые константы зашиваются компилятором куда-то после кода функции (каждой, видимо).
А адрес глобальных переменных, я выяснил, указывает в то место, где располагается загадочная секция под названием BSS.
А вот за что отвечает секция DATA? Какие данные лежат Там?
Да, а сегмент данных на какую секцию указывает в дельфийских программах? Как с ним связан регистр CS, как он используется машиной?
И ещё остался вопрос: где располагается эта куча - динамическая память? Какой у неё обычно диапазон адресов, где её вообще искать?

13-01-2007 04:41
Кстати, стеков у программы может быть несколько. Если работа программы распараллелена, то каждая нить получает свой независимый стек - об этом я писал вот здесь: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=44414

И на самом деле есть ещё одна область памяти, где могут размещаться переменные. Это TLS - thread local storage. С каждой нитью связывается такой блок памяти. Чтобы переменная попала туда, надо объявить её как глобальную, но со словом threadvar вместо var. Тогда для каждой нити будет создаваться независимая копия этой переменной.

12-01-2007 23:39
Локальные переменные попадают в стек. В прологе функции (т.е. в коде, с которого она начинается) в стеке резервируется место для них, в эпилоге - освобождается. Параметры функций тоже располагаются в стеке. Перед вызовом функции они помещаются в стек, затем в эпилоге функции (для моделей вызова register, stdcall, pascal) или в коде, следующем сразу за вызовом функции (для модели вызова cdecl) эта память возвращается стеку. При этом ещё один нюанс - при модели вызова register, которая принята по умолчанию, часть параметров может передаваться через регистры, а не через стек, если компилятор решит, что это будет оптимальнее. А вещественные параметры могут также передаваться через стек FPU.

Сегмент данных - это область памяти, используемая для хранения глобальных переменных и типизированных констант (потому что типизированные константы по своей внутренней сути те же глобальные переменные, только компилятор искусственно ограничивает возможности их изменения). Размер сегмента данных определяется на этапе компиляции и не меняется в процессе работыпрограммы.

Ещё остаётся так называемая динамическая память - память, которую программа может выделять и освобождать по мере необходимости. Понятно, что при этом надо как-то вести учёт занятых и свободных участков памяти, уметь находить свободные участки и т.п. - одним словом, как-то управлять этой памятью. Существует несколько способов управления, но в Windows используется практически только один из них - "куча", поэтому слова "куча" и "динамическая память" обычно используются как синонимы.

В Delphi есть специальный блок, называемый менеджер памяти - он отвечает за выделение и освобождение динамической памяти. Работает он так: запрашивает у системы большие блоки памяти с помощью VirtualAlloc, а потом по мере необходимости выделяет в них более мелкие куски и возвращает указатели на них.

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

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования