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

Вниз

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

 
Bless   (2003-10-29 09:51) [0]

В книжках написано, что память под класс выделяется уже на этапе объявления
То есть запись вида

TMyClass=class(TCustomGrid);

уже занимает память, хотя еще ни одного экземпляра класса создано не было. Как узнать, сколько именно памяти?

И еще вопрос. Объявление вида
x:TTable; тоже занимет память?


 
Skier   (2003-10-29 10:17) [1]


> x:TTable; тоже занимет память?

Занимает - 4 байта, ибо это всего навсего типизированный указатель.


 
Anatoly Podgoretsky   (2003-10-29 10:36) [2]

Нет на этапе объявления он еще ничего не занимает, занимать 4 байта он будет если будет объявлен объект этого класса.
Не могу даже преположить, что за книги он прочитал, но возможно он прочитал правильные книги, но неправильно понял.


 
Romkin   (2003-10-29 10:43) [3]

Да, немного неправильно. объявление класса - фактически указатель на VMT, а она занимает 76 байт плюс по 4 на каждый виртуальный метод.


 
Skier   (2003-10-29 10:43) [4]

>Anatoly Podgoretsky © (29.10.03 10:36) [2]
Согласен. Если x не будет использоваться то компилятор её "выкинет"


 
Nikolay M.   (2003-10-29 11:02) [5]


> занимает 76 байт плюс по 4 на каждый виртуальный метод

Зависит от версии Дельфи :)
В Д6: 76, а в Д4: 64 :))


 
Bless   (2003-10-29 11:11) [6]

>Нет на этапе объявления он еще ничего не занимает, занимать 4
>байта он будет если будет объявлен объект этого класса.

Но ведь существуют так называемые методы класса, которые можно вызывать до создания объекта класса. Следовательно, и память на эти методы должна выделяться до создания объекта класса. Разве нет?

>Да, немного неправильно. объявление класса - фактически указатель
>на VMT, а она занимает 76 байт плюс по 4 на каждый виртуальный
>метод.

А что неправильно? Я об этом и говорил, может непонятно выразился. А откуда ты знаешь, что 76 байт+4 на вирт. методы?
Из книги? Я это тоже как бы знаю из книги. Но интересует, как можно в Delphi этот размер увидеть? Неужели никак? Но в книгу люди же не от фонаря писали.
Мне что, надо просметреть всю иерархию классов в поисках виртуальных методов, чтобы узнать размер?
Кстати, о "плюс по 4 на каждый виртуальный метод":

"по 4..." -это ведь память на указатели на методы? А память на то, на что они указывают, разве не выделяется? Выходит, больше чем 76+N*4, или нет?


 
Nikolay M.   (2003-10-29 11:18) [7]


> А откуда ты знаешь, что 76 байт+4 на вирт. методы?

Start/Programs/Delphi/Help/Object Pascal Reference/Memory management/Class types


 
Woolen   (2003-10-29 11:35) [8]

"по 4..." -это ведь память на указатели на методы? А память на то, на что они указывают, разве не выделяется? Выходит, больше чем 76+N*4, или нет?
На код они указывают, блин, который лежит в теле экзешника и никогда никакой памяти не займет, если не будет обращений в эту часть файла (всмысле, к этой странице).
Если я не ошибаюсь, Delphi зашивает в экзешник что-то о классе, но оно опять же попадает только при крайней надобности вместе с остальной частью даных, пришедшихся на эту страницу. Это кусок экзешшника.
А полученная память экзешником - это другое. Там можно узнать, сколько объект конкретного класса занимает: TObject.InstanceSize, то есть, сколько приложение получает от винды памяти при создании экземпляра.


 
Игорь Шевченко   (2003-10-29 11:53) [9]

Память, занимаемая классом и память, занимаемая объектом класса, это разные вещи. Размер какой именно памяти интересует ?


 
Bless   (2003-10-30 17:01) [10]

>Размер какой именно памяти интересует ?

памяти класса. А что, есть чем дополнить уже высказавшихся?


 
Nikolay M.   (2003-10-30 17:17) [11]


> Bless (30.10.03 17:01) [10]
> >Размер какой именно памяти интересует ?
> памяти класса.

Имхо, если не объявлены процедуры(функции) класса, то 0. AFAIU, класс - всего лишь объявление типа. Т.е. вопрос почти эквивалентен "Сколько памяти занимает тип integer"? Если не брать во внимание вышеуказанные функции класса и код компилятора, отвечающий за собственно создание объекта класса, тогда 0.
Все вышесказанное - имхо, буду рад, если кто-то подтвердит сие или опровергнет, в любом случае - польза.


 
Игорь Шевченко   (2003-10-30 17:29) [12]

Bless (30.10.03 17:01)

А смысл в измерении "памяти класса" ? Зависит от многих параметров, от количества виртуальных и динамических методов, от количества published свойств и полей и еще от много чего. Зачем нужно знать этот размер ?


 
handra   (2003-10-30 17:49) [13]

class function InstanceSize: Longint;
не оно ли?


 
Игорь Шевченко   (2003-10-30 17:57) [14]

handra © (30.10.03 17:49)


> InstanceSize


Это как раз размер экземпляра (instance)


 
vuk   (2003-10-30 17:59) [15]

Похоже ответа на самый главный вопрос - "А нафига?" так и не будет. :o)


 
handra   (2003-10-30 18:59) [16]

14] Игорь Шевченко © (30.10.03 17:57)
handra © (30.10.03 17:49)
> InstanceSize
Это как раз размер экземпляра (instance)

а не смущает ли Вас ее определения как class-function


 
handra   (2003-10-30 19:00) [17]

хотя нет - в хелпе явно написано


 
vuk   (2003-10-30 19:18) [18]

Это мало того, что не должно смущать, это само собой разумеется, т.к. функция используется для выделения памяти под экземпляр, т.е. экземпляра-то как раз еще и не существует.


 
Bless   (2003-10-31 14:30) [19]

>Похоже ответа на самый главный вопрос - "А нафига?" так и не
>будет. :o)

Не будет. Мне это ни для чего практически не надо.
Просто у меня почти паранойя началась. После того как прочитал о памяти, занимаемой классом, боюсь новые переменные объявлять.
Вот и решил выяснить этот вопрос поподробнее.
Кстати, основной вопрос был КАК измерить размер (из среды Делфи или во время выполнения). Но и за это спасибо.



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

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

Наверх





Память: 0.49 MB
Время: 0.033 c
3-41059
Новичок
2003-10-24 06:22
2003.11.13
Проблема с SQL-запросами. Виснут.


1-41491
P0tia
2003-10-28 15:18
2003.11.13
Значок при перетаскивании


6-41852
SEvgeniy
2003-09-05 18:27
2003.11.13
ограничение трафика


1-41139
karan
2003-10-31 11:51
2003.11.13
ActiveX


1-41636
atmospheric
2003-10-25 16:58
2003.11.13
Ключи





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