![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
Bokul |
![]()
Сообщение
#1
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Объект TObject занимает в памяти 8 байт - сума двух longint, т.е. места для методов не резервируется. Мне интересно, как и где в памяти размещаются методы объектов и куда я обращаюсь, вызывая метод по ссылке - po^.method?
-------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Если бы объект в каждой своей копии хранил код методов, это было бы слишком расточительно, согласись.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Bokul |
![]()
Сообщение
#3
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата Если бы объект в каждой своей копии хранил код методов, это было бы слишком расточительно, согласись. Соглашаюсь ![]() -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата куда я обращаюсь, вызывая метод по ссылке ![]() unit unit_1; uses unit_1; + вспомни, ЧЕМ объект с виртуальными методами отличается от объекта БЕЗ оных... ![]() |
Bokul |
![]()
Сообщение
#5
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Цитата { <--- Куда ты здесь обращаешься? } Не знаю... ![]() Цитата + вспомни, ЧЕМ объект с виртуальными методами отличается от объекта БЕЗ оных... У него есть поле таблицы виртуальных методов? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата У него есть поле таблицы виртуальных методов? ![]() Очень удобно... И ничего не надо нигде хранить (в смысле, при создании динамического объекта не надо таскать за собой еще адреса и забивать память). |
Bokul |
![]()
Сообщение
#7
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Можно чуть-чуть придраться?
![]() известно, какой метод и какого объекта будет вызываться Т.е. известно адреса методов в сегменте? Цитата подставляет адрес этого метода (размещенного в сегменте кода) напрямую... Подставляет куда? volvo, не мог бы ты детально описать, что происходит на уровне памяти в моем коде? Извиняюсь за свою недоходчивость... Сообщение отредактировано: Bokul - 2.12.2006 4:55 -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
Lapp |
![]()
Сообщение
#8
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
> Подставляет куда?
Да уж, действительно придираешься.. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата известно адреса методов в сегменте? А как же... Конечно известно... Ты никогда не задумывался, почему происходит, например, такая вещь:typeА потому, что это - Forward declaration, и уже после объявления типа T компилятор знает, где будут располагаться все его методы, ибо количество методов ему известно, параметры известны... Что еще ему надо? ![]() А вызвать метод объекта не описав его тип у тебя не получится по любому, синтаксис языка это запрещает... Поэтому Паскаль, кстати, так быстро компилирует - за один проход... В отличие от С/С++, которые работают за 3-4 прохода... Цитата Подставляет куда? Вместо вызова obj.A; в генерируемый код подставляется CALL {адрес_метода} (ну, в смысле, опкод этого выражения)... |
Bokul |
![]() ![]()
Сообщение
#10
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 117 Пол: Мужской Реальное имя: Богдан Репутация: ![]() ![]() ![]() |
Кажется я начинаю понимать...
Нигде не встречал информации о том, где хранится виртуальный метод, где? В куче? Тот же вопрос для VMT? Если бы method в моем коде был виртуальным, что Паскаль бы поставил на место po^.method; при компиляции? Таблица виртуальных методов всегда находится по одному адресу? Т.е. на этапе компиляции мы знаем ее адрес? Где можно почитать о структуре сегмента кода, данных? Цитата Что еще ему надо? Код? -------------------- Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее. |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата Нигде не встречал информации о том, где хранится виртуальный метод, где? В куче? Виртуальный метод с точки зрения компилятора что, отличается от статического? Он как-то по-другому написан? Для него другой синтаксис? Зачем его хранить ИНАЧЕ чем статический? Он также хранится в сегменте кода, только вот адрес точки входа в него заносится в VMT...Цитата Тот же вопрос для VMT? То же самое... Не нужно ничего лишнего хранить в "куче", поэтому сама VMT хранится в сегменте данных, а экземпляр объекта содержит 16-битный указатель на нее (фактически - смещение в DS). Подробнее - здесь:Глава 17. Внутренний формат объектов |
![]() ![]() |
![]() |
Текстовая версия | 14.06.2024 19:51 |