OSDev

для всех
Текущее время: 22 июл 2019, 12:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Объект
СообщениеДобавлено: 11 апр 2011, 20:43 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
Незнаю, в эту ли ветку надо было запостить, пусть модераторы если что исправят.

Народ. Помогите реализовать объект.
Чтото я не могу домыслить как сделать объекты, как их расположить в памяти, что нужно учесть и пр.

Вот к примеру самый простой объект: число.

Т.е. то что будет создано в выражении: a=129;
как должен выглядеть такой объект?
Код:
; INTERFACE
ObjectType   dd 1
ObjectSubType   db 1
Value   dd ?


или более развернуто
Код:
; INTERFACE
ObjectType   dd OT_POINTER
ObjectSubType   db BT_BYTE
VTablePtr   dd Vtable

; Vtable
Vtable:
FieldNamePtr   dd FieldName
ValueDataPtr   dd ValueData

; DATA
FieldName   db 'a',0
ValueData   dd ?


Проще говоря: мой мозг не может сообразить как это выглядит внутри.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Объект
СообщениеДобавлено: 11 апр 2011, 22:33 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1382
В простейшем случае объект (т.е. экземпляр переменной, типом которой является класс) состоит всего из двух элементов: указателя на таблицу виртуальных методов (VMT) и области, содержащей значения полей ("переменных") объекта. Такие вещи, как размер памяти, необходимый объекту, если он действительно нужен в самом объекте, можно хранить по заранее известным смещениям в VMT либо в полях, занимающих фиксированные адреса в начале области памяти, выделенной под объект (как, собственно, хранится адрес VMT). На практике, естественно, может быть предусмотрена более сложная структура.

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

В общем, вариантов реализации море, и всё зависит от потребностей и фантазии разработчиков. Можете для интереса какой-нить простенький класс слепить на любом из ЯВУ, поддерживающих ООП, и посмотреть, какой код будет сгенерирован компилятором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Объект
СообщениеДобавлено: 15 апр 2011, 01:13 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1087
Откуда: Балаково
Изначально объект создаётся путём выделения оперативной памяти с помощью обычной процедуры выделения памяти. Тоесть, создание объекта буквально сводится к вызову менеджера памяти.
Память можно выделять и на стеке локальной процедуры, без использования системного менеджера.
Память можно зарезервировать и в сегменте данных.

Структура объекта опысывается с помощью struc, и на основе неё производятся все манипуляции с ранее выделенной под объект памятью.
При создании объекта в стековом фрейме или в сегменте данных, указывается имя структуры в качестве типа объекта (вместо обычных db, dw). Компилятор определяет размер стуктуры, и выделяет память соответствующего размера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Объект
СообщениеДобавлено: 16 апр 2011, 14:26 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1382
К вопросу о (не)использовании ООП в осеписании (и не только)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Объект
СообщениеДобавлено: 18 апр 2011, 05:09 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
SII писал(а):

О чем хотел сказать автор?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Объект
СообщениеДобавлено: 18 апр 2011, 21:51 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1382
О том, что нужно всегда хорошенько подумать, прежде чем применять тот или иной подход в конкретной задаче.

А вот что такое фейк, лично я не знаю, хоть и смутно догадываюсь. Но вот Ваше удивление меня порядком удивило. А во что ещё может превращаться программа на языке высокого уровня? ООП, не ООП -- какая разница с точки зрения машины? Все выражается через одни и те же инструкции, а значит, на нижнем уровне никакой принципиальной разницы нет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB