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

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

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

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

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

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

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

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

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

Выделение памяти (new) - C++
Наткнулся на пример где делают непонятные мне выделения памяти с помощью new X* pi = new X; X* p2 = new X ; X* рЗ = new (&buffer )...

Выделение памяти - C++
int main() { FILE *fIn = NULL, *fOut =NULL; Error EMyError; CNodeStack *Start; CNodeStack *ListF = new CNodeStack; ...

Выделение памяти... - C++
Вот решил себе ликбез устроить и возникли вопросы: 1) Почему char* p = "fffff"; не реагирует на delete p 2) Когда надо...

Выделение памяти. - C++
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов неизвестно.Может быть 10 а может быть...

Выделение памяти - C++
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

Выделение памяти - C++
Доброго времени суток. Чтобы выделить память под двумерный массив в такой форме: //n - переменная, M - константа arr = new double...

Выделение памяти - C++
Какая разница между выделением памяти функциями malloc, calloc, realloc и оператором new? И как изменить размер выделенной памяти без...

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...

Выделение памяти - C++
Во время выполнения программы после ввода нескольких символов выводит ошибку: double free or corruption(out): 0x0000000001157010 ***...

выделение памяти - C++
Здравствуйте, помогите пожалуйста исправить ошибку, это лишь малая часть кода. В задании: поле name должно быть динамическим: char...

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

Выделение памяти - C++
Добрый вечер. Немогу никак понять некоторые тонкости выделения памяти. Во первых: на что указывает указатель, при записи char*...


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

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

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

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

примерно так...
Schizorb
509 / 461 / 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
5416 / 4812 / 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
Модератор
22447 / 10852 / 1767
Регистрация: 12.02.2012
Сообщений: 17,969
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     Выделение памяти
Ответ Создать тему
Опции темы

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