![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
mister2010 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Например я написал такой код:
Для того чтоб создать объект статически, то есть память по которой будет хранится объект это стек - память выделяемая во время выполнения для моего екзе ОП памятью. То есть вот это
Когда же я написал:
Это означает что я объявил указатель под названием лук, который ссылается на область памяти по которой лежит что-то из класса, и этот указатель лук после того как сослался на область памяти по которой к примеру лежит переменная z из класса Box, указатель лук присваивает себе эту область памяти; 1)Где тут создается объект динамический, если это указатель на что-то из класса? 2)Почему, чтоб получить доступ динамически к классу нужно именно писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса? |
||||||
|
|||||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
Физически в памяти это будет выглядет так ![]() Uploaded with ImageShack.us Т.е. тебе сначала нужно получить адрес в памяти размещенного обекта (эти самые 4-е байта), а уже затем по смещению получать доступ к данным класса (смещение расчитывается компилятором). -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
1)
Какой памяти, стека или кучи, получить указателем лук? 2)Чем отличается куча от стека? |
|||
|
||||
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
1)А чо так? Указатель находится в стеке ,а объект в куче?
Стек - это часть оп. памяти и куча это часть оп памяти? 2)
Указателем лук? Как объект буде называться,который мы получаем? 3) Где статически хранятся объекты а где динамические хранятся? 4)Последнее, что тревожит, если создать статически объект, он имеет имя, а динамически, какое имя имеет объект? |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
mister2010, не стоит путать динамическое и статическое время жизни. Статическое означает что инстанс (объект) живёт всё время жизни процесса(на стеке). Динамический же постоянно создаётся и уничтожается и он тоже может находиться на стеке, например, нестатические локальные переменные внутри функции.
Это сообщение отредактировал(а) Леопольд - 3.6.2010, 21:59 -------------------- вопросов больше чем ответов |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
На заметку. Помимо стека и кучи есть еще область статической памяти, в которую попадают константы, глобальные и статические переменные.
Добавлено через 3 минуты и 31 секунду >Стек - это часть оп. памяти и куча это часть оп памяти? Стек - эта такая "подвижная" штука. Например вызываете функцию, на стек попадают ее внутренние переменные и возможно параметры функции. Вызвали следующую - опять, но уже для нее. Вышли из второй функции - стек отмотался, вышли из первой - вернулся в исходное состояние. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
mister2010, когда программа запускается на выполнение, операционная система выделяет её ресурсы, строго отведённое количество (зависит от настроек и от ОС). Стек один из этих ресурсов (поэтому при бесконечной рекурсии возникает переполнение стека). Куча, грубо говоря, тоже выдаётся процессу но уже в рантайме, чем больше процесс выделяет памяти при помощи new, malloc и т.п. системных вызовов (т.е. процесс обращается к системе за ресурсом), тем большая куча ему выдаётся. Но, в рантайме (поэтому называют динамически) может обращаться не только за памятью. Можно, например, содавать потоки, которые на многоядерных процессорах будут выполняться на самом деле парралельно. Обращаться к файлам, всевозможным девайсам. В общем, грубо говоря, всё это сводится к "системным вызовам". Поэтому иногда просто необходимо знать как работает целевая ОС и какими возможностями обладает.
З.Ы. Вполне вероятно, что ОС может позволить увеличить стек в рантайме. Тут всё от неё зависит. Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:09 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
куча тоже не безразмерна... Ну и самое главное отличие кучи от стека не в этом.. даже просто вдумчивое прочтение названий даст ответ на это. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
-------------------- вопросов больше чем ответов |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
То есть то ,что в коде программы написано статически, при запуске файла екзе на компе, оперативной памятью выделяется часть памяти для хранения этого статического,эта память назыв. стек, а то что в программе написано операцией new , оперативная память выделяет тоже част ь памяти только её называют куча?
Это сообщение отредактировал(а) mister2010 - 3.6.2010, 22:15 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Всё это зависит от ОС. Мне скоро предстоит под OSE программировать. Я пока не понял как там вообще с кучей дела обстоят. Пока что, у меня сложилось впечатление что размер кучи задаётся при компиляции... Хотя, насчёт главного отличия спорить не буду.
![]() Добавлено @ 22:17 ![]() Это сообщение отредактировал(а) Леопольд - 3.6.2010, 22:19 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
mister2010, нет
существуют три вида хранения: статическое - на протяжении выполнения программы автоматическое - на протяжении выполнения функционального блока динамическое - определяется клиентом "класически" программа обладает одним стеком, который служит для хранения автоматических переменных..суть в том что в стек можно добавлять только в конец и удалять с конца, поэтому соблюдается структурный порядок созднания /удаления переменных. "куча" - она беспорядочна по своей сути.. т.е. порядок создания и удаления в ней произвольно выбранный программистом, поэтому она "отведена" под хранение динамических объектов. Это сообщение отредактировал(а) mes - 3.6.2010, 22:26 |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Леопольд, она rw. И называется статической.
Добавлено через 1 минуту и 2 секунды
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Видимо так и есть. Однако константы, строковые литералы и машинный код обычно лежат в ro.
З.Ы. У меня сейчас каша какая-то в голове с этой OSE... -------------------- вопросов больше чем ответов |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Статические объекты хранятся в стеке,части оп памяти ,а динам. объекты в куче, части оп памяти. Так?
|
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
mister2010, переменные, объявленные в функции, параметры функций проходят через стек - часть оп. Динамически созданные хранятся в куче, части оп.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Всё хранится в виде объектов в статической и динамической памяти? Если да, то почему?
|
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Вы ЕГЭ по информатике онлайн сдаете что ли?
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Да нет, так чтоб понять для себя.
|
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Как грамотно ответить что означает вот это объявление первой и второй строки?
Это сообщение отредактировал(а) mister2010 - 3.6.2010, 23:37 |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
d - это ведь не объект, это только переменная которая будет содержать адрес объекта, какого? Как узнать имя динамического объекта? |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>это только переменная которая будет содержать адрес объекта, какого?
Да. Переменная создается на стеке, объект - в куче. Переменная содержит адрес этого объекта >Как узнать имя динамического объекта? Имя? Переменной-указателя - никак. На один объект может указывать стопицот указателей. Название типа - через RTTI, но это не используется в обычной практике. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
1)А статические объекты тоже в куче создаются ? Стек не содержит объектов? 2) Box *d = new Box; d это только переменная которая будет содержать адрес объекта, а почему объекта? Если я напишу d->ser(); Где тут указание на объект? Это указатель на функцию класса. Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:10 |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>А статические объекты тоже в куче создаются ?
Они создаются в третьей области памяти - статической. Я же писал об этом! >Стек не содержит объектов? Box d создает объект d типа Box на стеке. В вашем же примере d=new Box стек объектов не содержит. >а почему объекта? Потому что new Box создают новый объект типа Box. >Если я напишу d->ser(); Где тут указание на объект? d - "указание на объект". А ->ser() вызов функции (метода) этого объекта. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
"указание на объект" - Как узнать на какой объект ссылается указатель д если как вы говорите у динамического объекта нету имени? Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:26 |
|||
|
||||
djamshud |
|
||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>"указание на объект" - Как узнать на какой объект ссылается указатель д если как вы говорите у динамического объекта нету имени?
Неправильно:
Правильно:
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||
|
|||||
mister2010 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
На какой объект я так и не понял? Например возьмём первый иф. Если объект под именем d равен объекту по имени d1, тогда что может быть? Каким образом я в этом случаи узнаю на какой объект ссылается указатель от этой строки?
Это сообщение отредактировал(а) mister2010 - 4.6.2010, 00:56 |
||||
|
|||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>Каким образом я в этом случаи узнаю на какой объект ссылается указатель от этой строки?
После этой строки d будет указывать на только что созданный объект. Оператор new как раз возвращает этот указатель, а d= - присваивает его указателю d. То есть вы знаете об этом. Вы его создали и помните, что d - это вооон тот объект. В общем попробуйте сами подумать и поэкспериментировать. Я спать. И вам спокойной ночи. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
А где вы видите этот только что созданный объект где он создался, я не вижу покажи в каком месте?
|
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Вот здесь я вижу, что создался новый объект. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
mister2010, почитай про указатели в FAQ.
любая переменная - это объект. переменные могут храниться в одной из 3-х областей памяти: 1. статическая (размещение переменной определяется на этапе компиляции и производится только 1 раз при запуске программы) 2. стековая (относительное размещение переменной определяется на этапе компиляции, а производится при каждом входе в функциональный блок) 3. динамическая (размещение переменных, количество, размер, назначение определяется при выполнении программы в зависимости от текущих действий). Компилятор дает возможность программисту выбрать, где ему размещать переменную:
В этом примере теряется доступ к переменным в динамической памяти, так как не были сохранены их адреса. Чтобы исправить это, необходимо присвоить результат выполнения new и malloc некому указателю. Как написано в приведенном выше FAQ, указатель это такая переменная, которая содержит адрес другой переменной. Что называется "указывает":
Это сообщение отредактировал(а) bsa - 4.6.2010, 12:41 |
||||
|
|||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Статичекая память выделяется оп. памябтью только на этапе компиляци только? Когда уже программа скомпилина, оперативная память работает с программой выделяя только ей стековую и динамическую память и больше никакую?
Который имеет имя д? Или он есть а мы не знаем как он называется? |
|||
|
||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
на этапе компиляции ничего не выделяется... не "статическая память" а область памяти предназначенная для хранения статических объектов.
оперативная память ничего не выделяет - выделяет ось. с точки зрения программиста, есть три "стандартных" вышеупомянутых хранилища.. Как они реализованы физически зависит от разработчиков. p.s. правильней сказать не "три хранилища" , а "три способа хранения". за подробностями в книжку ![]() Добавлено через 4 минуты и 46 секунд
не у каждого объекта есть имя.. new создает безъимянный объект, чтоб до него можно было добраться (обычно) его адрес присваивают указателю.
|
||||||||
|
|||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
mister2010, рекомендую почитать книжки об устройстве компьютера, чтобы понимать какой узел за что отвечает. Чтобы не было потом "оперативная память выделяет". Это звучит так же, как "земля выделяет участок под посевы озимых".
![]() |
|||
|
||||
mister2010 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 25.5.2010 Репутация: нет Всего: нет |
Скажите одно, в чём различие стековой памяти от статической в программировании?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
mister2010, интернет + google = информация
-------------------- вопросов больше чем ответов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |