Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Понятие принципа создание динамических объектов 
:(
    Опции темы
mister2010
Дата 3.6.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



Например я написал такой код:
Код

#include <iostream>
#include <string>

using namespace std;

class Box
{
     public:
           double width;
           int z;
           Box(char *u) { cout<<u<<endl; };
           Box(int rediska) { cout<<rediska; };
           Box() {};
     };

int main()
{
     setlocale(0,"");

     Box *d1 = new Box("Привет клоун");
     Box *d2 = new Box(7);
     Box * lyk = new Box;
     Box(); 

     delete d1;
     delete d2;

     cin.get();
}



Для того чтоб создать объект статически, то есть память по которой будет хранится объект это стек - память выделяемая во время выполнения для моего екзе ОП памятью. То есть вот это 
Код
Box induk; //Создание объекта который будет иметь имя индюк


Когда же я написал: 
Код
Box * lyk = new Box;

Это означает что я объявил указатель под названием лук, который ссылается на область памяти по которой лежит что-то из класса, и этот указатель лук после того как сослался на область памяти по которой к примеру лежит переменная z из класса Box, указатель лук присваивает себе эту область памяти;  

1)Где тут создается объект динамический, если это указатель на что-то из класса?
2)Почему, чтоб получить доступ динамически к классу нужно именно 
писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса?
PM MAIL   Вверх
jonie
Дата 3.6.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата


1)Где тут создается объект динамический, если это указатель на что-то из класса?
указатель находится в стеке (и займет на x86 32 бита), а сам объект в Heap (куче) и может занять много больше места, чем доступно в стеке.
Цитата

2)Почему, чтоб получить доступ динамически к классу нужно именно 
писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса? 
см выше.

Физически в памяти это будет выглядет так
user posted image

Uploaded with ImageShack.us
Т.е. тебе сначала нужно получить адрес в памяти размещенного обекта (эти самые 4-е байта), а уже затем по смещению получать доступ к данным класса (смещение расчитывается компилятором).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mister2010
Дата 3.6.2010, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.5.2010

Репутация: нет
Всего: нет




1) 
Код

Т.е. тебе сначала нужно получить адрес в памяти размещенного обекта (эти самые 4-е байта)


Какой памяти, стека или кучи, получить указателем лук?

2)Чем отличается куча от стека?
PM MAIL   Вверх
jonie
Дата 3.6.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата


Какой памяти, стека или кучи, получить указателем лук?
адрес объекта, который находится в куче
Цитата

2)Чем отличается куча от стека? 
 в модели памяти flat [http://en.wikipedia.org/wiki/Flat_memory_model] принципиально ничем. Другое дело, что компилятор под стек выделяет определенное количество памяти (около 4-х мегабайт) - т.е. его может не хватить под большие объекты.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
mister2010
Дата 3.6.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



1)А чо так? Указатель находится в стеке ,а объект в куче?
 Стек - это часть оп. памяти и куча это часть оп памяти? 

2) 
Код

Т.е. тебе сначала нужно получить адрес в памяти размещенного объекта

Указателем лук?
Как объект буде называться,который мы получаем?

3) Где статически хранятся объекты а где динамические хранятся?

4)Последнее, что тревожит, если создать статически объект, он имеет имя, а динамически, 
какое имя имеет объект?
PM MAIL   Вверх
Леопольд
Дата 3.6.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



mister2010, не стоит путать динамическое и статическое время жизни. Статическое означает что инстанс (объект) живёт всё время жизни процесса(на стеке). Динамический же постоянно создаётся и уничтожается и он тоже может находиться на стеке, например, нестатические локальные переменные внутри функции.

Это сообщение отредактировал(а) Леопольд - 3.6.2010, 21:59


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
djamshud
Дата 3.6.2010, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



На заметку. Помимо стека и кучи есть еще область статической памяти, в которую попадают константы, глобальные и статические переменные.

Добавлено через 3 минуты и 31 секунду
>Стек - это часть оп. памяти и куча это часть оп памяти?

Стек - эта такая "подвижная" штука. Например вызываете функцию, на стек попадают ее внутренние переменные и возможно параметры функции. Вызвали следующую - опять, но уже для нее. Вышли из второй функции - стек отмотался, вышли из первой - вернулся в исходное состояние.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Леопольд
Дата 3.6.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



mister2010, когда программа запускается на выполнение, операционная система выделяет её ресурсы, строго отведённое количество (зависит от настроек и от ОС). Стек один из этих ресурсов (поэтому при бесконечной рекурсии возникает переполнение стека). Куча, грубо говоря, тоже выдаётся процессу но уже в рантайме, чем больше процесс выделяет памяти при помощи new, malloc и т.п. системных вызовов (т.е. процесс обращается к системе за ресурсом), тем большая куча ему выдаётся. Но, в рантайме (поэтому называют динамически) может обращаться не только за памятью. Можно, например, содавать потоки, которые на многоядерных процессорах будут выполняться на самом деле парралельно. Обращаться к файлам, всевозможным девайсам. В общем, грубо говоря, всё это сводится к "системным вызовам". Поэтому иногда просто необходимо знать как работает целевая ОС и какими возможностями обладает.

З.Ы. Вполне вероятно, что ОС может позволить увеличить стек в рантайме. Тут всё от неё зависит.

Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:09


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 3.6.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Леопольд @  3.6.2010,  21:06 Найти цитируемый пост)
когда программа запускается на выполнение, операционная система выделяет её ресурсы, строго отведённое количество (зависит от настроек и от ОС). Стек один из этих ресурсов (поэтому при бесконечной рекурсии возникает переполнение стека). 

куча тоже не безразмерна... 
Ну и самое главное отличие кучи от стека не в этом.. даже просто вдумчивое прочтение названий даст ответ на это.



--------------------
PM MAIL WWW   Вверх
Леопольд
Дата 3.6.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(djamshud @  3.6.2010,  22:00 Найти цитируемый пост)
Помимо стека и кучи есть еще область статической памяти, в которую попадают константы, глобальные и статические переменные.
Скорее не то что-бы она статическая. Здесь лучше подойдёт read-only доступ. Т.е. строковые литералы, константы, собственно сам исполняемый машинный код...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mister2010
Дата 3.6.2010, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



То есть то ,что в коде программы написано статически, при запуске файла екзе на компе, оперативной памятью выделяется часть памяти для хранения этого статического,эта память назыв. стек, а то что в программе написано операцией new , оперативная память выделяет тоже част ь памяти только её называют куча?

Это сообщение отредактировал(а) mister2010 - 3.6.2010, 22:15
PM MAIL   Вверх
Леопольд
Дата 3.6.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(mes @  3.6.2010,  22:11 Найти цитируемый пост)
Ну и самое главное отличие кучи от стека не в этом.
Всё это зависит от ОС. Мне скоро предстоит под OSE программировать. Я пока не понял как там вообще с кучей дела обстоят. Пока что, у меня сложилось впечатление что размер кучи задаётся при компиляции... Хотя, насчёт главного отличия спорить не буду. smile

Добавлено @ 22:17
Цитата(mister2010 @  3.6.2010,  22:13 Найти цитируемый пост)
что в коде программы написано статически
 smile Стек он и в Африке стек. Перечитай пост mes'а. Разберись что на самом деле значит вызов функции и рекурсия, это поможет понять.


Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:19


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 3.6.2010, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



mister2010, нет
существуют три вида хранения:
 статическое - на протяжении выполнения программы 
 автоматическое -  на протяжении выполнения функционального блока 
 динамическое - определяется клиентом 

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

 
 

Это сообщение отредактировал(а) mes - 3.6.2010, 22:26


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 3.6.2010, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Леопольд, она rw. И называется статической.

Добавлено через 1 минуту и 2 секунды
Код

int foo; //в статической памяти. Можно читать и писать.

int main(){
return 0;}



--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Леопольд
Дата 3.6.2010, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(djamshud @  3.6.2010,  22:20 Найти цитируемый пост)
Леопольд, она rw. И называется статической.
Видимо так и есть. Однако константы, строковые литералы и машинный код обычно лежат в ro.

З.Ы. У меня сейчас каша какая-то в голове с этой OSE...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1077 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.