Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
3-40815
Лена
2003-10-21 11:49
2003.11.13
ошибка key violation


3-41010
Piton X
2003-10-14 13:44
2003.11.13
Запрос об оплате услуг по датам. Строки - люди, столбцы - даты, а


1-41177
MaxwellZ
2003-11-02 17:09
2003.11.13
Оформление формы


1-41566
Andrew1_1
2003-10-26 21:32
2003.11.13
2 вопроса про DLL


1-41726
hooky-mars
2003-11-02 14:28
2003.11.13
Настройки Explorer`а