Форум: "Основная";
Текущий архив: 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.038 c