OSDev
http://osdev.su/

Объект
http://osdev.su/viewtopic.php?f=6&t=408
Страница 1 из 1

Автор:  qeos [ 11 апр 2011, 20:43 ]
Заголовок сообщения:  Объект

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

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

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

Т.е. то что будет создано в выражении: 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 ?


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

Автор:  SII [ 11 апр 2011, 22:33 ]
Заголовок сообщения:  Re: Объект

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

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

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

Автор:  Himik [ 15 апр 2011, 01:13 ]
Заголовок сообщения:  Re: Объект

Изначально объект создаётся путём выделения оперативной памяти с помощью обычной процедуры выделения памяти. Тоесть, создание объекта буквально сводится к вызову менеджера памяти.
Память можно выделять и на стеке локальной процедуры, без использования системного менеджера.
Память можно зарезервировать и в сегменте данных.

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

Автор:  SII [ 16 апр 2011, 14:26 ]
Заголовок сообщения:  Re: Объект

К вопросу о (не)использовании ООП в осеписании (и не только)

Автор:  qeos [ 18 апр 2011, 05:09 ]
Заголовок сообщения:  Re: Объект

SII писал(а):

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

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

Автор:  SII [ 18 апр 2011, 21:51 ]
Заголовок сообщения:  Re: Объект

О том, что нужно всегда хорошенько подумать, прежде чем применять тот или иной подход в конкретной задаче.

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/