Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ипользование объекта вместо записи


Страницы:   1 2

atruhin ©   (2006-09-03 12:26:00) 

Иногда удобно вместо записи использовать объект, например:
Вместо:
record X,Y : integer; end;
Использовать:
class
 X, Y : integer;
 constructor Create(aX,aY : integer);
end;
Вопрос: какова разница в объеме занимаемой памяти? Т.е. таблицы VMT, доп. информация? И влияет ли на разницу наличие constructor


zamtmn   (2006-09-06 13:58:00) [1]

>>Дело в том что для оbject все равно создается таблица VMT.
согласен, я имел ввиду разницу хранения в памяти экземпляра record и object. заголовок vmt всеравно будет создан для работы TypeOf, но он будет один для всех объектов данного типа


oxffff   (2006-09-06 12:34:00) [2]

to zamtmn ©  

> разницы не будет никакой до появления виртуальных методов

Разница все таки будет.

Дело в том что для оbject все равно создается таблица VMT.
Где по -4 байт хранится смещение относительно начала экземпляра,
где хранится указатель на VMT.
Где по -8 байт хранится размер экземпляра.

Другое дело, если не объявлены виртуальные методы, тогда конструктор
просто не инициализирует в экземпляре указатель на VMT.
Но таблица VMT существовать будет.


zamtmn   (2006-09-05 10:37:00) [3]

to oxffff
а я в свою очередь незаметил Ваш пост [20]. извиняюсь
to atruhin
в случае использования
object
X, Y : integer;
constructor Create(aX,aY : integer);
end;
разницы не будет никакой до появления виртуальных методов


oxffff   (2006-09-05 10:28:00) [4]

to zamtmn
Полностью согласен с вами.
Когда постил
oxffff ©   (04.09.06 12:59) [19]  
не обратил внимание на object.

В следующем посте извинился.
oxffff ©   (04.09.06 13:02) [20]

Просто к счастью не довелось работать с оbject.
Вчера достал у себя в закромах старую книгу и почитал.
Действительно указатель на VMT "плавающий".


zamtmn   (2006-09-05 10:21:00) [5]

tobj1=object
                field1,field2:intrger
        end;
tobj2=object(tobject1)
                field3:integer
                procedure test;virtual;abstract;
        end;
в памяти tobj1 будет выглядить - field1,field2
tobj2 - field1,field2,^VMT,field3


zamtmn   (2006-09-05 10:16:00) [6]

to oxffff

> Вы путаете это с С++
>
> Указатель на VMT всегда по нулевому смещению

Справедливо для class, у object VMT не всегда находится по нулеыому смещению, более того его может не быть вообще, если нет виртуальных методов


oxffff   (2006-09-04 16:50:00) [7]

to atruhin
class это не только VMT
Размер типа
      VMT
      +dynamic method table
      +short string containing class name
      +method definition table
      +type information table
      +instance initialization table
      +Automation information table
      +interface table


oxffff   (2006-09-04 16:33:00) [8]

to atruhin
oxffff ©   (04.09.06 12:47) [16]
oxffff ©   (04.09.06 12:47) [17]
Может вам стоит быть внимательнее


atruhin   (2006-09-04 15:38:00) [9]

> [16] oxffff ©   (04.09.06 12:42)

Ну дак а я о чем писал? Посмотри внимательнее.

> [21] default ©   (04.09.06 13:35)

Спасибо. Исчерпывающий ответ. Больше вопросов нет.


default   (2006-09-04 13:35:00) [10]

atruhin ©   (04.09.06 12:32) [15]
открываем справку по Delphi, затем переходим на вкладу поиска по указателю, заносим в строку поиска абру "vmt" и читаем, там всё написано
также написано и
"The first 4-byte field of every object is a pointer to the virtual method table (VMT) of the class."
надо зырить на процент памяти, используемый на указатель на vmt, по сравнению с размером записи
4/SizeOf(TRecord)
на другую инфу можно забить ибо она хранится в единственном экземпляре


oxffff   (2006-09-04 13:02:00) [11]

to han_malign
Тут возможно я не прав. Не обратил внимание на object
Прошу извинить на поспешность.


oxffff   (2006-09-04 12:59:00) [12]

> GrayFace ©   (04.09.06 11:07) [12]
>
> > Джо ©   (03.09.06 14:02) [4]
> >А у object накладные расходы на служебную информацию (VMT),
> > а именно их и хотят, по возможности, избежать ;)
> По-моему, расходы есть только если есть виртуальные методы.

han_malign
>- так и есть, причем, если добавить виртуальный метод, то адресс VMT >будет лежать не по нулевому смещению, а после полей базовового >объекта>(из-за чего нужно быть внимательным при приведении объектных >типов по record-маске)...

Вы путаете это с С++

Указатель на VMT всегда по нулевому смещению


han_malign   (2006-09-04 12:52:00) [13]


> GrayFace ©   (04.09.06 11:07) [12]
>
> > Джо ©   (03.09.06 14:02) [4]
> >А у object накладные расходы на служебную информацию (VMT),
> > а именно их и хотят, по возможности, избежать ;)
> По-моему, расходы есть только если есть виртуальные методы.

- так и есть, причем, если добавить виртуальный метод, то адресс VMT будет лежать не по нулевому смещению, а после полей базовового объекта(из-за чего нужно быть внимательным при приведении объектных типов по record-маске)...


oxffff   (2006-09-04 12:47:00) [14]

Размер объекта равен
        указатель на VMT (4 байта)
        +размер полей

Размер типа
       VMT
       +dynamic method table
       +short string containing class name
       +method definition table
       +type information table
       +instance initialization table
       +Automation information table
       +interface table


oxffff   (2006-09-04 12:42:00) [15]

taa=record
a:integer;
end;

classA=class
public
b:taa;
procedure abc;virtual;abstract;
end;

showmessage(inttostr(classA.InstanceSize)) // равно 8


atruhin   (2006-09-04 12:32:00) [16]

> [14] oxffff ©   (04.09.06 12:15)

Почему?


oxffff   (2006-09-04 12:15:00) [17]

Нет


atruhin   (2006-09-04 11:47:00) [18]

Спасибо за ответы. Не уверен в одном моменте.
Разница в объеме памяти между объектами и записями определяется так:
размер памяти для объектов типа:
TTest = class
 REC : TMyRecord;
end;
будет
(Sizeof(TMyRecord)+4)*CountObject + SizeOf(VMT)
где CountObject - кол-во созданных объектов.

Это правильно?


GrayFace   (2006-09-04 11:07:00) [19]

> Джо ©   (03.09.06 14:02) [4]
А у object накладные расходы на служебную информацию (VMT), а именно их и хотят, по возможности, избежать ;)
По-моему, расходы есть только если есть виртуальные методы.


Германн   (2006-09-04 00:47:00) [20]

Я лично, очень часто использую объект вместо записи. Во-первых, как уже было сказано, поля объекта инициализируются при создании, во-вторых удобно создавать и использовать список таких объектов с помощью TList. Особенно с учётом Д4. Ну а размер меня мало волнует. У меня объекты создаются не очень часто и уничтожаются "как только, так сразу".


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо