![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ипользование объекта вместо записи
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. Ну а размер меня мало волнует. У меня объекты создаются не очень часто и уничтожаются "как только, так сразу".