Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
#1

Выделение памяти - C++

22.06.2012, 12:15. Просмотров 1169. Ответов 5
Метки нет (Все метки)

Нубский вопрос, но не могу до конца разобраться. Допустим, есть простое определение переменной:

C++
1
int ival = 1024;
Когда и как производится выделение под неё памяти? Из книжки Липпмана: "определение переменной заставляет компилятор выделить в памяти область, достаточную для хранения переменной типа int, связать с этой областью имя ival и поместить туда значение 1024".

В каком смысле компилятор? Допустим, я потом запускаю готовый исполняемый файл, каким образом тут компилятор мне что-то выделит?

И в какой момент времени происходит выделение памяти под переменные? Когда встречается их определение или же одномоментно для всех, в начале работы программы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 12:15     Выделение памяти
Посмотрите здесь:

Выделение памяти C++
C++ Выделение памяти...
Выделение памяти C++
C++ Выделение памяти
C++ Не выделение памяти
C++ Выделение памяти (new)
C++ Распределение памяти. Динамическое выделение памяти
C++ Выделение памяти
Выделение памяти C++
Выделение памяти C++
Выделение памяти C++
C++ Выделение памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22147 / 10621 / 1729
Регистрация: 12.02.2012
Сообщений: 17,667
22.06.2012, 12:50     Выделение памяти #2
Могу предположить

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

2) В run-time, при входе в функцию, в стеке создается кадр соотв. размера. С этого момента переменная существует.

примерно так...
Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.06.2012, 13:09  [ТС]     Выделение памяти #3
Catstail, идею примерно понял... в литературе для начинающих этот вопрос подробно не освещён, буду изучать дальше.
XpertVision
17 / 17 / 3
Регистрация: 14.06.2012
Сообщений: 150
22.06.2012, 13:14     Выделение памяти #4
Я может не прав, но :

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

Это так..вкратце.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.06.2012, 13:55     Выделение памяти #5
Можно здесь почитать: http://dvo.sut.ru/libr/cvti/i618buz/8.htm
По динамической памяти, здесь: http://programmersclub.ru/31/

Цитата Сообщение от Schizorb Посмотреть сообщение
В каком смысле компилятор? Допустим, я потом запускаю готовый исполняемый файл, каким образом тут компилятор мне что-то выделит?
В самом вопросе есть ответ. Никак не выделит.

Цитата Сообщение от Schizorb Посмотреть сообщение
Когда и как производится выделение под неё памяти?
Всё зависит от того, какой класс памяти задан для переменной. Если статический, то память выделяется во время компиляции, в передназначенном для этого сегменте программы (в сегменте данных). Если автоматический, то память выделяется в стеке, во время работы программы. Если динамический (через new, malloc, calloc), то память выделяется во время работы программы, в специальной области памяти компьютера, назывемой куча.
Catstail
Модератор
22147 / 10621 / 1729
Регистрация: 12.02.2012
Сообщений: 17,667
22.06.2012, 14:54     Выделение памяти #6
Для XpertVision. Компилятор данную команду переводит в маш. код. Это верно. Например, команда
i=5 переводится примерно вот в это mov [ebx+10],5. Адрес, куда указывает [ebx+10] и есть адрес переменной. Если считать, что ebx указывает на начало кадра в стеке для хранения переменных, то смещение 10 определяет компилятор. Переменная создается, не когда к ней обращаются, а когда осуществляется вход в функцию. Это делает инициализирующая часть объектного кода (обычно скрытая).

Если же есть объявление int i=777; то инициализирнующая часть кода не только выделяет память под i, но и заносит в нее 777.
Yandex
Объявления
22.06.2012, 14:54     Выделение памяти
Ответ Создать тему
Опции темы

Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru