Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

И в какой момент времени происходит выделение памяти под переменные? Когда встречается их определение или же одномоментно для всех, в начале работы программы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 12:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти (C++):

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти - C++
Доброго всем вечера. В книжке нашел задание: определить класс, представляющий стек. Сделал так, что при заполнении всего стека,...

Выделение памяти - C++
Платформа и компилятор x64. Установлено 64Gb ОЗУ, 60Gb из них откусил SQL Server. Пытаюсь сделать следующее: struct Dictionary { ...

выделение памяти - C++
#include <iostream> using namespace std; class Matrix { int m, n; public: float **M; Matrix(int a, int b); void...

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

5
Catstail
Модератор
22833 / 11199 / 1812
Регистрация: 12.02.2012
Сообщений: 18,437
22.06.2012, 12:50 #2
Могу предположить

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

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

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

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

Это так..вкратце.
1
alsav22
5426 / 4821 / 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), то память выделяется во время работы программы, в специальной области памяти компьютера, назывемой куча.
1
Catstail
Модератор
22833 / 11199 / 1812
Регистрация: 12.02.2012
Сообщений: 18,437
22.06.2012, 14:54 #6
Для XpertVision. Компилятор данную команду переводит в маш. код. Это верно. Например, команда
i=5 переводится примерно вот в это mov [ebx+10],5. Адрес, куда указывает [ebx+10] и есть адрес переменной. Если считать, что ebx указывает на начало кадра в стеке для хранения переменных, то смещение 10 определяет компилятор. Переменная создается, не когда к ней обращаются, а когда осуществляется вход в функцию. Это делает инициализирующая часть объектного кода (обычно скрытая).

Если же есть объявление int i=777; то инициализирнующая часть кода не только выделяет память под i, но и заносит в нее 777.
1
22.06.2012, 14:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 14:54
Привет! Вот еще темы с ответами:

Выделение памяти - C++
Здравствуйте! #include<iostream> int main() { int *mass = new int ; int *mass2 = new int ; std::cout << (unsigned int)mass <<...

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

Выделение памяти(С = С++) - C++
Привет. Нужна помощь, в выделении памяти. Есть код на С, нужно перевести его в С++. int SaveFileOne(int i) { FILE *f; if ((f =...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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