Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Вниз

Экземпляр объекта.   Найти похожие ветки 

 
Leon-Z ©   (2011-02-24 22:26) [0]

Как экземпляр объекта расположен в памяти ? т.е как бы
выглядело описание класса (объекта) на ассемблере ?


 
Игорь Шевченко ©   (2011-02-24 22:35) [1]

RTFS: system.pas


 
Юрий Зотов ©   (2011-02-24 22:36) [2]

Располагается в динамической памяти. Представляет собой набор полей, первое из которых - ссылка на VMT, а остальные - поля класса в порядке их объявления. Первыми идут поля предков, за ними - поля потомков.


 
Leon-Z ©   (2011-02-24 22:40) [3]


> Юрий Зотов ©   (24.02.11 22:36) [2]
> Располагается в динамической памяти. Представляет собой
> набор полей, первое из которых - ссылка на VMT, а остальные
> - поля класса в порядке их объявления. Первыми идут поля
> предков, за ними - поля потомков.


Так, хорошо. А подробнее ??? Где методы ??? (статические в том числе и предков). Где виртуальные методы расположены ?

Динамическая память - только для данных ??? Но тогда где код расположен ???


 
Игорь Шевченко ©   (2011-02-24 22:44) [4]


> Но тогда где код расположен ???


в EXEшнике


 
Leon-Z ©   (2011-02-24 22:52) [5]


> Игорь Шевченко ©   (24.02.11 22:44) [4]
> > Но тогда где код расположен ???в EXEшнике


Не в EXE-шнике, а в сегменте кода.


 
Юрий Зотов ©   (2011-02-24 22:52) [6]

> Leon-Z ©   (24.02.11 22:40) [3]

> Динамическая память - только для данных?

Да.

> Где методы ??? (статические в том числе и предков).
> Где виртуальные методы расположены ?
> где код расположен ???

Код расположен там, где ему и положено располагаться - в кодовом сегменте статической памяти. Статические методы вызываются напрямую, а виртуальные и динамические - через VMT.


 
clickmaker ©   (2011-02-24 22:53) [7]

а сегмент кода - в EXEшнике


 
Игорь Шевченко ©   (2011-02-24 22:54) [8]


> Не в EXE-шнике, а в сегменте кода.


ну ты умный, зачем тогда спрашиваешь ?


 
Leon-Z ©   (2011-02-24 23:02) [9]


> ну ты умный, зачем тогда спрашиваешь ?


А я Вас и не спрашивал. Я прошу проффесионалов помочь мне разобраться с этим вопросом. Кто хочет поприкалываться, прошу идите в чат.
А мне надо реферат написпть по теме "Объекты и память."


 
KilkennyCat ©   (2011-02-24 23:06) [10]

а у фон неймана все не так.


 
Referer   (2011-02-24 23:07) [11]

>> А мне надо реферат написпть по теме "Объекты и память."

А в качестве источника delphimaster укажешь? :о)

P.S. Двоешник ты!


 
KilkennyCat ©   (2011-02-24 23:08) [12]


> А мне надо реферат написпть по теме "Объекты и память."

ну так и напиши там: "Не смог написать, потому что Игорь Шевченко прикалывался, но в чат не шел".


 
Leon-Z ©   (2011-02-24 23:12) [13]


> Referer   (24.02.11 23:07) [11]
> >> А мне надо реферат написпть по теме "Объекты и память.
> "А в качестве источника delphimaster укажешь? :о)P.S. Двоешник
> ты!


А мы так хорошо знакомы, что можем общаться на "ты"?
А в качестве источника я думал кто-нибудь тут посоветует мне литературу по этой теме.


 
KilkennyCat ©   (2011-02-24 23:14) [14]


> посоветует мне литературу

ну посмотри на свой вопрос и еще раз подумай, что должны были подумать, о том, что ты имел ввиду.


 
Leon-Z ©   (2011-02-24 23:19) [15]


> KilkennyCat ©   (24.02.11 23:14) [14]
> > посоветует мне литературуну посмотри на свой вопрос и
> еще раз подумай, что должны были подумать, о том, что ты
> имел ввиду.


И что же должны подумать?


 
Юрий Зотов ©   (2011-02-24 23:19) [16]

> Leon-Z ©   (24.02.11 23:12) [13]

> литературу по этой теме.

Тут две темы - одна по объектам Delphi, вторая - по памяти.

Первая тема:
Рэй Конопка. Создание оригинальных компонент в среде Delphi.

Вторая тема:
Джеффри Рихтер. Windows для профессионалов.


 
Игорь Шевченко ©   (2011-02-24 23:24) [17]


> А мне надо реферат написпть по теме "Объекты и память."


реферат - это продукт самостоятельной работы или я чего-то не понимаю ?


 
Leon-Z ©   (2011-02-24 23:29) [18]


> Игорь Шевченко ©   (24.02.11 23:24) [17]
> > А мне надо реферат написпть по теме "Объекты и память.
> "реферат - это продукт самостоятельной работы или я чего-
> то не понимаю ?<Цитата>


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


 
KilkennyCat ©   (2011-02-24 23:30) [19]


> Юрий Зотов ©   (24.02.11 23:19) [16]

а причем здесь делфи и виндоус? или об этом тож надо было догадываться....


 
Leon-Z ©   (2011-02-24 23:39) [20]


> KilkennyCat ©   (24.02.11 23:30) [19]
> > Юрий Зотов ©   (24.02.11 23:19) [16]а причем здесь делфи
> и виндоус? или об этом тож надо было догадываться....


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


 
Игорь Шевченко ©   (2011-02-24 23:51) [21]

RTFS: system.pas

Инофрмации там достаточно, вот и собирай ее. Самостоятельно.


 
Inovet ©   (2011-02-24 23:51) [22]

> [20] Leon-Z ©   (24.02.11 23:39)
> статические методы, виртуальные методы ?

Тебе же ЮЗ ответил

> [6] Юрий Зотов ©   (24.02.11 22:52)
> Статические методы вызываются напрямую, а виртуальные и
> динамические - через VMT.

В таблице VMT указатели на методы, т.е. адреса их для косвенного вызова.


 
Abramov Petr V.   (2011-02-24 23:56) [23]


> Ведь в асме описываются сегменты, и в зависимости от типа
> сегмента там
> размещаются данные или код. А объект в делфи - это композиция
> данных и кода и она не отражает то, как объект расположен
> в памяти.

после работы компилятора тоже все раскидывается по сегментам, данные к данным, код к коду.
все методы класса превращаются в обычные функции, но с еще одним параметром - указателем на экземпляр класса, для которого она вызвана.

т.е.
procedure TMyClass.proc1(x: integer);

превращается в
proc1(self: pointer; x: integer);
а ее вызов
MyClass1.proc1(123)
в
proc1(MyClass1, 123) -- где MyClass1 - указатель на область в
-- сегменте данных, в которой хранятся значения полей экземпляра.
т.е. вся композиция легким движением руки превращается в набор обычных ф-ций, которым передаются обычные указатели на структуры.


 
Leon-Z ©   (2011-02-25 00:05) [24]


> Игорь Шевченко ©   (24.02.11 23:51) [21]
> RTFS: system.pas
> Инофрмации там достаточно, вот и собирай ее. Самостоятельно.


Я смотрел. Там объявлен класс  TObject. Но объявлен он как любой другой класс в делфи. И с памятью там работают через какой-то менеджер.
Я просил не это.
Как объект расположен в памяти ? Буквально, вот например:

type
 TMyClass = class
 private      
   MyVar: Integer;
   procedure DoSomething;
 end;

...
реализация класса



То же на асме как будет выглядеть?


.data
 MyVar dd ?

.code
 DoSomething proc
 ...
 endp
end.

   

Так будет выглядеть объект ?


 
Leon-Z ©   (2011-02-25 00:12) [25]


> Abramov Petr V.   (24.02.11 23:56) [23]


Спасибо !!!! Вы единственный понимающий суть моего вопроса человек!!! Вот это я и хотел узнать. А где можно подробнее прочесть по это?

Ну например, как на ассемблере описать объект ???


 
Abramov Petr V.   (2011-02-25 00:19) [26]


> Leon-Z ©   (25.02.11 00:12) [25]


> Спасибо !!!! Вы единственный понимающий суть моего вопроса
> человек!!! Вот это я и хотел узнать.

да нет, просто что же Вы хотели узнать, стало понятно только в [20] в результате обсуждения :)

> Ну например, как на ассемблере описать объект ???

прочесть особо негде (ну или см [16]), а если более менее знаете ассемблер, проще всего писать простенькие кусочки на  delphi и смотреть, во что они превращаются на ассемблере.


 
Игорь Шевченко ©   (2011-02-25 00:20) [27]


> Как объект расположен в памяти ?


type
 TFoo = class
 public
    destructor Destroy; override;
    procedure first_virtual_method; virtual;
    procedure second_virtual_method; virtual;
    procedure non_virtual;
 end;

=>

.code

             .... тут еще куча стандартных данных
             dd offset TObject.FreeInstance
             dd offset TFoo.Destroy
TFoo_vmt dd offset TFoo.first_virtual_method
             dd offset TFoo.second_virtual_method
     ....

TFoo.Destroy proc
 ...
endp

TFoo.non_virtual proc
 ..
endp

TFoo.first_virtual_method proc
....
endp

TFoo.second_virtual_method proc
...
endp

end

как-то так


 
Ляпа   (2011-02-25 01:22) [28]

http://rapidshare.com/#!download|319dt|174478787|Turbo_Assembler_Tom_Swan_rus.rar|6186

Том Сван. Освоение Turbo Assembler. (1996 г.)
Глава 14. Программирование с объектами.


 
Германн ©   (2011-02-25 04:30) [29]


> Leon-Z ©   (25.02.11 00:12) [25]
>
>
> > Abramov Petr V.   (24.02.11 23:56) [23]
>
>
> Спасибо !!!! Вы единственный понимающий суть моего вопроса
> человек!!! Вот это я и хотел узнать. А где можно подробнее
> прочесть по это?
>
> Ну например, как на ассемблере описать объект ???
>

А вас никак не смущает очевидная чушь такого вопроса?
В виду того, что вы должны
На ассемблере никак нельзя"описать объект"!


 
oxffff ©   (2011-02-25 08:28) [30]


> clickmaker ©   (24.02.11 22:53) [7]
> а сегмент кода - в EXEшнике


Так его. Так.


 
oxffff ©   (2011-02-25 08:28) [31]


> Leon-Z ©   (24.02.11 23:02) [9]
>
> > ну ты умный, зачем тогда спрашиваешь ?
>
>
> А я Вас и не спрашивал. Я прошу проффесионалов помочь мне
> разобраться с этим вопросом


Мда.


 
oxffff ©   (2011-02-25 08:38) [32]

Сейчас в объекте Delphi(новых версиях)в самом конце существует еще одно дополнительное поле - поле синхронизации.

P.S.
Вообще метод не обязательно должен принимать неяный параметр self.
Однако в огромном большинстве случаев это именно так.
Однако существуют языки программирования где методы реализуются для для каждого экземпляра, то есть метод не принимает неявный параметр self, а он в него "прошит".


 
Плохиш ©   (2011-02-25 09:29) [33]


> А вас никак не смущает очевидная чушь такого вопроса?

"Его высочество" сантехников это не смущает.

PS. А в качестве источников почему-то никто ещ&#235; гугля не посоветовал.


 
alexdn ©   (2011-02-25 09:39) [34]


> Abramov Petr V.   (24.02.11 23:56) [23]
>
> > Ведь в асме описываются сегменты, и в зависимости от типа
>
> > сегмента там
> > размещаются данные или код. А объект в делфи - это композиция
>
> > данных и кода и она не отражает то, как объект расположен
>
> > в памяти.
>
> после работы компилятора тоже все раскидывается по сегментам,
>  данные к данным, код к коду.
> все методы класса превращаются в обычные функции, но с еще
> одним параметром - указателем на экземпляр класса, для которого
> она вызвана.
> т.е. вся композиция легким движением руки превращается в
> набор обычных ф-ций,
Вот и я так думал, что вообщем вся эта работа с классами, обьектами и вообще всё обьектно-ориентированное программирование это извращённое отношение к функциям.


 
Leon-Z ©   (2011-02-25 09:54) [35]


> Ляпа   (25.02.11 01:22) [28]
> http://rapidshare.com/#!download|319dt|174478787|Turbo_Assembler_Tom_Swan_rus.
> rar|6186 Том Сван. Освоение Turbo Assembler. (1996 г.)Глава
> 14. Программирование с объектами.


Спасибо!!! Скачаю и буду разбираться.

А вообще неясным остался механизм виртуальных методов. Если со статическими понятно - они превращаются в обычные ф-ии и располагаются в сегменте кода, а ссылки на ник "прошиваются в код", то с виртуальными как ?

И как заполняется таблица VMT ? Если у потомка и у предка описан одинаковый виртуальный метод, то адрес какого метода записывается в VMT ? Или оба метода добавляются в таблицу ?


 
oxffff ©   (2011-02-25 10:08) [36]


> то с виртуальными как ?


indirect обращения прописываются в код. Аналог вызов импортируемых функций


> И как заполняется таблица VMT ?


Правильно заполняется.


 
Игорь Шевченко ©   (2011-02-25 10:16) [37]


> а ссылки на ник "прошиваются в код", то с виртуальными как
> ?


[27] не осилил ?


 
Anatoly Podgoretsky ©   (2011-02-25 11:07) [38]

> clickmaker  (24.02.2011 22:53:07)  [7]

А EXEшник на диске.
Вообще то в описание TASM есть информация по объектным расширениям Паскаля


 
Anatoly Podgoretsky ©   (2011-02-25 11:08) [39]

> Leon-Z  (24.02.2011 23:02:09)  [9]

А почему тогда такой странный путь выбран, изучения по помойке?


 
Anatoly Podgoretsky ©   (2011-02-25 11:09) [40]

> KilkennyCat  (24.02.2011 23:08:12)  [12]

И тут к нему еще и АП присоединился :-)


 
Anatoly Podgoretsky ©   (2011-02-25 11:11) [41]

> Leon-Z  (24.02.2011 23:39:20)  [20]

Нифига ты об ассемблере ничего не знаешь, ужас


 
Anatoly Podgoretsky ©   (2011-02-25 11:14) [42]

> Abramov Petr V.  (25.02.2011 00:19:26)  [26]

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


 
MsGuns ©   (2011-02-25 11:58) [43]

Блин, диссертация на тему "Технология добывания творога из вареников"


 
Dimka Maslov ©   (2011-02-25 12:21) [44]


> И как заполняется таблица VMT ? Если у потомка и у предка
> описан одинаковый виртуальный метод, то адрес какого метода
> записывается в VMT ? Или оба метода добавляются в таблицу
> ?


Таблица виртуальных методов у всех объектов одного класса одна. В неё записываются все виртуальные методы самого класса. Если метод не переопределён в указанное место записывается адрес метода предка. При вызове виртуальной функции генереруется код, который берёт адрес метода из таблицы и передаёт в него управление
примерно так:
call [eax+offset], где offset - смещение адреса виртуального метода, известное только компилятору.

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

Подобные вещи подробно описаны в старых книгах по программированию (издания примерно 90-х годов прошлого века).


 
Anatoly Podgoretsky ©   (2011-02-25 13:02) [45]

> Dimka Maslov  (25.02.2011 12:21:44)  [44]

В том то и дело, что многие вещи описаны только в старых книга.


 
Abramov Petr V.   (2011-02-25 13:17) [46]


> Anatoly Podgoretsky ©   (25.02.11 11:14) [42]
>
> > Abramov Petr V.  (25.02.2011 00:19:26)  [26]
>
> Не естественно ассемлер изучать по Дельфи, лучше напрямую
> с помощью
> учебников, которые никогда секретом не были.

изучать конечно, не лучший способ, подразумевается, что инструмент на базовом уровне осилен, а почитать творчество умных людей (компилятора) всегда полезно.


 
картман ©   (2011-02-25 13:48) [47]


> Dimka Maslov ©   (25.02.11 12:21) [44]

думаю, автору не нужно описание(хотя, это тоже) "сверху у нас лежат яблоки, на полке ниже помидоры...", в первую очередь ему картинка треба - умозрительная вещь, она умозрительна... мда...


 
Григорьев Антон ©   (2011-02-25 13:54) [48]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=216 - маловато и с некоторыми неточностями, но полезная информация имеется.


 
Dimka Maslov ©   (2011-02-25 14:06) [49]


> В том то и дело, что многие вещи описаны только в старых
> книга.


Если автор пишет реферат, то тем более ему надо ознакомится с литературой. А то, что современной литературы на эту тему нет - это не оправдание. Библиотеки никто ещё массово не позакрывались.


> в первую очередь ему картинка треба

В тех старых книгах и картинки есть


 
картман ©   (2011-02-25 15:57) [50]


> В тех старых книгах и картинки есть

иии? Как называются? Мне правда не для реферата...


 
Dimka Maslov ©   (2011-02-25 16:09) [51]

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


 
Leon-Z ©   (2011-02-25 16:20) [52]


>Игорь Шевченко ©   (25.02.11 10:16) [37]
>а ссылки на ник "прошиваются в код", то с виртуальными как?
>[27] не осилил ?

Этот псевдокод мне известен. Вы ничего нового мне не поведали.


> Anatoly Podgoretsky ©   (25.02.11 11:11) [41]
> > Leon-Z  (24.02.2011 23:39:20)  [20] Нифига ты об ассемблере
> ничего не знаешь, ужас

И что-же мне надо узнать об ассемблере?

>Dimka Maslov ©   (25.02.11 12:21) [44]
Спасибо за хороший ответ.


 
Игорь Шевченко ©   (2011-02-25 16:42) [53]


> Вы ничего нового мне не поведали


Ну вот, напрасно старался.


 
картман ©   (2011-02-25 16:43) [54]


> Leon-Z ©   (25.02.11 16:20) [52]
>
>
> >Игорь Шевченко ©   (25.02.11 10:16) [37]
> >а ссылки на ник "прошиваются в код", то с виртуальными
> как?
> >[27] не осилил ?
>
> Этот псевдокод мне известен. Вы ничего нового мне не поведали.
>

а разве [27] и [44] до половины не тот же хрен, только вид сбоку?
Троечник.


 
картман ©   (2011-02-25 16:44) [55]


> Dimka Maslov ©   (25.02.11 16:09) [51]

пасиб


 
Dimka Maslov ©   (2011-02-25 16:58) [56]


> картман ©   (25.02.11 16:44) [55]

Неправда моя. Попутал. Книга называется "Дейл Роджерсон. Основы COM"



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.004 c
15-1298356869
Гость
2011-02-22 09:41
2011.06.12
Изменить шаблон, где можно ?


1-1256627612
Lionel
2009-10-27 10:13
2011.06.12
Вывод числа прописью в компонент Memo в FastReport


15-1298266795
Лун
2011-02-21 08:39
2011.06.12
Облегчить беспорядок


15-1298541431
И. Павел
2011-02-24 12:57
2011.06.12
Как явно привести тип массива в яве?


15-1298041715
Leonid Troyanovsky
2011-02-18 18:08
2011.06.12
Гугль рулит





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский