Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2009, 14:39   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Выделение памяти

Интересует такой вопрос, разъясните пожалуйста кто в курсе.
Например у меня много глобальных переменных в проекте. Если сделать их полями класса (формы), то тогда насколько я знаю при создании класса память выделится из кучи.
Как происходит выделение памяти для глобальных?
Если форма главная и до завершения программы закрываться не будет, есть ли принципиальная разница где объявлять переменные?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 26.08.2009, 15:21   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

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

По моему, все зависит не от того где переменная определена, а от того, с откуда вы ее вызываите

Ну в общих чертах, я где-то так представляю этот процесс, а так сам даже не задумывался в серьез, не зачем
BOBAH13 вне форума Ответить с цитированием
Старый 26.08.2009, 15:24   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.08.2009, 15:48   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Глобальные переменные находятся в сегменте данных.
В Windows сегментов данных нет,есть только один сегмент для кода, данных и стека.

Цитата:
Сообщение от mutabor Посмотреть сообщение
есть ли принципиальная разница где объявлять переменные?
принципиальной разницы нет.

Цитата:
Сообщение от mutabor Посмотреть сообщение
Например у меня много глобальных переменных в проекте. Если сделать их полями класса (формы), то тогда насколько я знаю при создании класса память выделится из кучи.
а если сделать обычной глобальной переменной, то память для неё будет выделена при запуске приложения и освобождена при закрытия. Если она будет в форме, то память под неё будет выделена при создании формы.

Цитата:
Сообщение от mutabor Посмотреть сообщение
Как происходит выделение памяти для глобальных?
память под глобальные переменные выделяется закгрузчиком исполняемого файла при запуске программы. В исполняемом файле есть секция данных, у секции данных есть два важных параметра фактический размер и размер, который должен быть после загрузки в память. При компиляции компилятор считает общий размер всех перемернных типа
Код:
var
  x:integer = 56;
(т.е. те, которым заданы начальные значения, инициализированные переменные)
этот размер и считается фактическим размером секции данных, все эти переменные скидываются в секцию данных исполняемого файла. Потом компилятор считает общий размер все переменных типа
Код:
var
  y:integer;
(т.е. те, которым не заданы начальные значения, неинициализированные переменные)
полученный размер прибавляет к размеру инициализированных переменных, этот размер является размером секции данных которая должна быть в памяти. Неинициализированны переменные уже не скидываются в исполняемый файл их размер просто заносится в специальное поле. (неинициализированных переменных мы может указать сколько угодно и при этом размер экзешника не увеличится)
При загрузке загрузчик программ, смотрит размер данных, которые должны быть в памяти, и выделяет требуемый размер памяти (для инициализированных переменных и для неинициализированных переменных), потом копирует в эту память инициализированные переменные (данные из секции данных исполняемого файла), в результате чего у нас выделена память для всех переменных и в инициализированные переменные уже занесены нужные нам значения.

Последний раз редактировалось rpy3uH; 26.08.2009 в 16:04.
rpy3uH вне форума Ответить с цитированием
Старый 26.08.2009, 16:08   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
В Windows сегментов данных нет,есть только один сегмент для кода, данных и стека.
Хм.. Вот тут вот нашел:
http://www.beneto.ru/showed.php?id=525
Цитата:
Память для глобальных переменных выделяется в сегменте данных приложения и освобождается при его завершении. Локальные переменные живут в стеке (stack).
и http://www.delphikingdom.com/asp/ans...IDAnswer=48373 (самый нижний ответ)
Цитата:
Сегмент данных - это область памяти, используемая для хранения глобальных переменных и типизированных констант (потому что типизированные константы по своей внутренней сути те же глобальные переменные, только компилятор искусственно ограничивает возможности их изменения). Размер сегмента данных определяется на этапе компиляции и не меняется в процессе работыпрограммы.
......
.......
Или, может, я что-то не так понял?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.08.2009, 16:13   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

это не сегмент, это секция! Надо говорить секция данных. Сегмент данных - это более глобальное и общее понятие.

Последний раз редактировалось rpy3uH; 26.08.2009 в 16:17.
rpy3uH вне форума Ответить с цитированием
Старый 26.08.2009, 16:17   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если форма главная и до завершения программы закрываться не будет, есть ли принципиальная разница где объявлять переменные?
Лично я бы в класс их не помещал, если они конечно не должны быть для каждого экземпляра класса индивидуальными. Пусть будут глобальные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2009, 16:19   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
это не сегмент, это секция! Надо говорить секция данных. Сегмент данных - это более глобальное и общее понятие.
А.. тогда ясно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 26.08.2009, 18:16   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вопрос исчерпан, всем спасибо, особенно грузину!
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое выделение памяти FW-TOT Общие вопросы C/C++ 2 19.12.2008 00:42
До выделение памяти MAKTE Общие вопросы C/C++ 4 20.05.2008 21:34
Выделение памяти antoha.by Паскаль, Turbo Pascal, PascalABC.NET 2 29.04.2008 20:04
выделение оперативной памяти Alar Общие вопросы Delphi 0 29.10.2006 21:56