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

Вниз

как узнать сколько занимают в памяти поля объекта?   Найти похожие ветки 

 
FLIZ   (2002-08-01 23:34) [0]

ф-ия SizeOf(объект)
либо
SizeOf(его тип)
всегда возвращает одно
и тоже число. че-то я никак разобратся не могу :(


 
Юрий Зотов   (2002-08-01 23:47) [1]

См. TObject.InstanceSize.

А SizeOf(объект)и SizeOf(его тип) - это то же самое, что SizeOf(Pointer). То есть, 4 байта.


 
tovSuhov   (2002-08-02 09:24) [2]

Странно, разве SizeOf(TMyObject) не вернет мне размер в байтах моего объекта такого типа?


 
MBo   (2002-08-02 09:27) [3]

tovSuhov
все уже написал Ю.Зотов


 
tovSuhov   (2002-08-02 09:35) [4]

> MBo
Нет, меня просто смутила фраза ...SizeOf(его тип) - это то же самое, что SizeOf(Pointer). То есть, 4 байта
То, что SizeOf(объект) вернет размер указателя, это так. А вот вот насчет SizeOf(тип) сомневаюсь...В С++ возвращается именно размер типа. Ща попробую в паскале...


 
MBo   (2002-08-02 09:41) [5]

не сомневайся, проверено электроникой. То же и для AnsiString


 
tovSuhov   (2002-08-02 09:45) [6]

С++ Билдере, sizeof(TForm) = 752 байта, а в дельфях действительно 4. Надо же...


 
Anatoly Podgoretsky   (2002-08-02 09:53) [7]

Все равно это не вся память


 
tovSuhov   (2002-08-02 10:00) [8]

> Anatoly Podgoretsky
Это понятно...
А если не трудно, можете пояснить, почему так? В С++ похоже парень честно суммирует размеры всех входящих в тип полей, а что в Дельфи?


 
NailS   (2002-08-02 10:04) [9]

Для TMyObject = object sizeof(TMyObject) вернет размер полей.
Это считай структура с возможностью определения функций.
Похоже на С++.

Для TMyObject = class(TObject) sizeof(TMyObject) вернет размер указателя на объект.


 
DiamondShark   (2002-08-02 11:10) [10]


> А если не трудно, можете пояснить, почему так? В С++ похоже
> парень честно суммирует размеры всех входящих в тип полей,
> а что в Дельфи?


C++

class TMyClass
{
//Fields
};

typedef TMyClass *PMyClass;


Delphi

type
TMyClass = class
//Fields
end;


Так вот дельфевый TMyClass -- это сишный PMyClass.


 
Shaman_Naydak   (2002-08-02 11:22) [11]

В дельфях все переменные от класса (class) скрытые указатели, потому так и просходит..
В С+ же объект и есть объект.. как написали так и выделился..

Если же в дельфях нужно именно такой вариант см. наследие паскаля (object)

но я так понимаю, вопрос, скорее всего, теоретический


 
DiamondShark   (2002-08-02 11:23) [12]


> В С+ же объект и есть объект.. как написали так и выделился..


Что есть грубейшее нарушение парадигмы ООП


 
Толик   (2002-08-02 12:18) [13]

to Anatoly Podgoretsky © (02.08.02 09:53)
Неправда Ваша: sizeof(TForm) в С++ = TForm.InstanceSize() в Делфи. Оператор sizeof в С++ всегда показывает правильный размер.

to DiamondShark © (02.08.02 11:23)
Вот только не надо про то, что С++ нарушает "парадигмы ООП".
Интересно, в чём же Вы это усмотрели??? :)


 
Старый Паскалист   (2002-08-02 12:26) [14]

2DiamondShark
Дело в том, что ООП - не единственная парадигма, поддерживаемая С++. Есть ещё generic programming. (Может, есть и чего-то ещё...)

2Толик
Поля объекта тоже могут быть объектами. Их размер не учитывается (Правда, в Сях они могут быть статическими - тогда учтутся).


 
Anatoly Podgoretsky   (2002-08-02 12:28) [15]

Толик © (02.08.02 12:18)
Думаю тебе ответа от старого программисте достаточно?
Ну вот еще один есть три объекта, у котороых есть поля указатель на другой объект, сумма их размера
1. вариант 1 - у каждого указывает на разные объекты
2. вариант 2 - у каждого указывает на один и тот же объект


 
DiamondShark   (2002-08-02 13:51) [16]


> Вот только не надо про то, что С++ нарушает "парадигмы ООП".
> Интересно, в чём же Вы это усмотрели??? :)


Насчет "парадигмы" и правда, погорячился, а вот один из принципов -- точно, причем с последствиями не только для "красоты теории".
А Вы не усматривате? Тогда это Вам домашнее задание, на самостоятельное изучение.


> Есть ещё generic programming.


А это с чем едят? Знаю процедурное, знаю структурное, модульное, ООП, декларативное.
А generic -- это как?


 
Толик   (2002-08-02 14:27) [17]

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 относится только УКАЗАТЕЛЬ на А!!! Так что всё в порядке...


 
Старый Паскалист   (2002-08-02 14:55) [18]

2Толик ©
В Дельфи нет ОБЪЕКТОВ в том понимании, в котором ты написал.
(за исключением устаревшего object)
Все они суть УКАЗАТЕЛИ НА ОБЪЕКТ. Поэтому sizeof всегда даёт 4.

Тем не менее объектное поле (в Дельфи всегда - указатель на объект) может быть неотемлемой частью другого объекта, которое владелец создаёт и уничтожает, и даёт доступ к такому объекту только через SetXXX => Assign.



2DiamondShark © generic (обобщённое программирование) - шаблоны и иже с ними. Грубо говоря, классы для комплексных чисел, сток и тд (шаблонные ли, нешаблонные ли) - это не ООП, это как раз обобщённое программирование.
Как раз такие классы в основном создаются статически.

В парадигме ООП классы (из-за возможности наследования) всегда создаются динамически.



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

Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
3-48014
vib
2002-07-28 15:28
2002.08.15
Копирование


1-48085
maxim2
2002-08-05 08:22
2002.08.15
Люди не могу разобраться с заставкой


1-48138
YanKY
2002-08-01 10:16
2002.08.15
Как перехватить сообщение посланое net send


1-48162
maxim2
2002-08-01 13:13
2002.08.15
Как перевести секунды в формате 34545 в формат 00:00:00


1-48194
Fissher
2002-08-02 20:36
2002.08.15
Снова я со своим курсором





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский