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/ |