![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как узнать сколько занимают в памяти поля объекта? [D5, Win95/98]
FLIZ © (2002-08-01 23:34:00)ф-ия SizeOf(объект)
либо
SizeOf(его тип)
всегда возвращает одно
и тоже число. че-то я никак разобратся не могу :(
Старый Паскалист (2002-08-02 14:55:00) [1]2Толик ©
В Дельфи нет ОБЪЕКТОВ в том понимании, в котором ты написал.
(за исключением устаревшего object)
Все они суть УКАЗАТЕЛИ НА ОБЪЕКТ. Поэтому sizeof всегда даёт 4.
Тем не менее объектное поле (в Дельфи всегда - указатель на объект) может быть неотемлемой частью другого объекта, которое владелец создаёт и уничтожает, и даёт доступ к такому объекту только через SetXXX => Assign.
2DiamondShark © generic (обобщённое программирование) - шаблоны и иже с ними. Грубо говоря, классы для комплексных чисел, сток и тд (шаблонные ли, нешаблонные ли) - это не ООП, это как раз обобщённое программирование.
Как раз такие классы в основном создаются статически.
В парадигме ООП классы (из-за возможности наследования) всегда создаются динамически.
Толик (2002-08-02 14:27:00) [2]to Старый Паскалист (02.08.02 12:26),
Anatoly Podgoretsky © (02.08.02 12:28)
Если полем объекта является ОБЪЕКТ, то его размер будет учтён в sizeof, а вот если УКАЗАТЕЛЬ НА ОБЪЕКТ то sizeof совершенно справедливо посчитает 4 байта. Честно говоря я здесь никакой проблемы не вижу. Например есть объект A с размером 20 байт, есть объект B размером 10 байт, который ещё содержит указатель на A (+ 4 байта). Естесственно, что размер sizeof(B) будет 14 байт (а не 30), ведь остальные 20 байт относятся в объекту A, а к объекту B относится только УКАЗАТЕЛЬ на А!!! Так что всё в порядке...
DiamondShark (2002-08-02 13:51:00) [3]
> Вот только не надо про то, что С++ нарушает "парадигмы ООП".
> Интересно, в чём же Вы это усмотрели??? :)
Насчет "парадигмы" и правда, погорячился, а вот один из принципов -- точно, причем с последствиями не только для "красоты теории".
А Вы не усматривате? Тогда это Вам домашнее задание, на самостоятельное изучение.
> Есть ещё generic programming.
А это с чем едят? Знаю процедурное, знаю структурное, модульное, ООП, декларативное.
А generic -- это как?
Anatoly Podgoretsky (2002-08-02 12:28:00) [4]Толик © (02.08.02 12:18)
Думаю тебе ответа от старого программисте достаточно?
Ну вот еще один есть три объекта, у котороых есть поля указатель на другой объект, сумма их размера
1. вариант 1 - у каждого указывает на разные объекты
2. вариант 2 - у каждого указывает на один и тот же объект
Старый Паскалист (2002-08-02 12:26:00) [5]2DiamondShark
Дело в том, что ООП - не единственная парадигма, поддерживаемая С++. Есть ещё generic programming. (Может, есть и чего-то ещё...)
2Толик
Поля объекта тоже могут быть объектами. Их размер не учитывается (Правда, в Сях они могут быть статическими - тогда учтутся).
Толик (2002-08-02 12:18:00) [6]to Anatoly Podgoretsky © (02.08.02 09:53)
Неправда Ваша: sizeof(TForm) в С++ = TForm.InstanceSize() в Делфи. Оператор sizeof в С++ всегда показывает правильный размер.
to DiamondShark © (02.08.02 11:23)
Вот только не надо про то, что С++ нарушает "парадигмы ООП".
Интересно, в чём же Вы это усмотрели??? :)
DiamondShark (2002-08-02 11:23:00) [7]
> В С+ же объект и есть объект.. как написали так и выделился..
Что есть грубейшее нарушение парадигмы ООП
Shaman_Naydak (2002-08-02 11:22:00) [8]В дельфях все переменные от класса (class) скрытые указатели, потому так и просходит..
В С+ же объект и есть объект.. как написали так и выделился..
Если же в дельфях нужно именно такой вариант см. наследие паскаля (object)
но я так понимаю, вопрос, скорее всего, теоретический
DiamondShark (2002-08-02 11:10:00) [9]
> А если не трудно, можете пояснить, почему так? В С++ похоже
> парень честно суммирует размеры всех входящих в тип полей,
> а что в Дельфи?
C++
class TMyClass
{
//Fields
};
typedef TMyClass *PMyClass;
Delphi
type
TMyClass = class
//Fields
end;
Так вот дельфевый TMyClass -- это сишный PMyClass.
NailS (2002-08-02 10:04:00) [10]Для TMyObject = object sizeof(TMyObject) вернет размер полей.
Это считай структура с возможностью определения функций.
Похоже на С++.
Для TMyObject = class(TObject) sizeof(TMyObject) вернет размер указателя на объект.
tovSuhov (2002-08-02 10:00:00) [11]> Anatoly Podgoretsky
Это понятно...
А если не трудно, можете пояснить, почему так? В С++ похоже парень честно суммирует размеры всех входящих в тип полей, а что в Дельфи?
Anatoly Podgoretsky (2002-08-02 09:53:00) [12]Все равно это не вся память
tovSuhov (2002-08-02 09:45:00) [13]С++ Билдере, sizeof(TForm) = 752 байта, а в дельфях действительно 4. Надо же...
MBo (2002-08-02 09:41:00) [14]не сомневайся, проверено электроникой. То же и для AnsiString
tovSuhov (2002-08-02 09:35:00) [15]> MBo
Нет, меня просто смутила фраза ...SizeOf(его тип) - это то же самое, что SizeOf(Pointer). То есть, 4 байта
То, что SizeOf(объект) вернет размер указателя, это так. А вот вот насчет SizeOf(тип) сомневаюсь...В С++ возвращается именно размер типа. Ща попробую в паскале...
MBo (2002-08-02 09:27:00) [16]tovSuhov
все уже написал Ю.Зотов
tovSuhov (2002-08-02 09:24:00) [17]Странно, разве SizeOf(TMyObject) не вернет мне размер в байтах моего объекта такого типа?
Юрий Зотов (2002-08-01 23:47:00) [18]См. TObject.InstanceSize.
А SizeOf(объект)и SizeOf(его тип) - это то же самое, что SizeOf(Pointer). То есть, 4 байта.