Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2007, 15:19   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Как найти размер объекта

Имеется куча объектов разного типа (мои и не мои). Поля объектов имеют простые типы: integer, real, char, byte. Нужно узнать сколько памяти занимает каждый из них.
Sibedir вне форума Ответить с цитированием
Старый 14.11.2007, 15:32   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
Подмигивание

Функция SizeOf возвращает занимаемый размер (в байтах) переменной (Variable) или типа (Type).
Более подробно в справке Делфи или здесь:
http://www.delphibasics.ru/SizeOf.php
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 14.11.2007, 15:48   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Решил через MyObject.InstanceSize

Спасибо за ссылку: http://www.delphibasics.ru/SizeOf.php

Вопрос №2:
А что делать если поле типа String или Record или Array?

Последний раз редактировалось Вадим Мошев; 14.11.2018 в 15:07.
Sibedir вне форума Ответить с цитированием
Старый 14.11.2007, 16:14   #4
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

size:=sizeof(x), где х - хоть строка, хоть массив, хоть запись (структура).

Примечание:
*если строка задана как s:string; то размер будет всегда 4 (указатель). Если хотим узнать точнее пишем length(s) - возвращает длину строки. 1 символ = 1 байт
*если задана как s:=string[N]; (0 < N < 256) то размер будет N+1

При WideString аналогично, учитываем, что 1 символ = 2 байта. Юникод всё-таки)

Последний раз редактировалось zetrix; 14.11.2007 в 16:23.
zetrix вне форума Ответить с цитированием
Старый 14.11.2007, 16:25   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
size:=sizeof(x)
не конает для объектов.

Короче, есть некий класс:

Код:
TMyClass = class
  F1: Integer;
  F2: Real;
  F3: String;
end;
В коде:

Код:
var
  MyObject: TMyClass
...

Код:
  s1 := SizeOf (MyObject);
  s2 := MyObject.InstanceSize;
Имеем:

s1 = 4
s2 = 20

Ни то, ни другое не веоно

Мне нужен весь объем занимаемый объектом вместе с его полями. Не буду же я все доступные объекты регестрировать и по полям их проверять. Я пока на классы, поля которых являются объектами, и не замахиваюсь. Мне бы с массивами и записями разобраться.

Неужели задача неразрешима. Жаль

Последний раз редактировалось Вадим Мошев; 14.11.2018 в 15:18.
Sibedir вне форума Ответить с цитированием
Старый 14.11.2007, 18:29   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

TMyClass = class
F1: Integer;
F2: Real;
F3: String;
end;

PMyClass = ^TMyClass;

var
MyObject: PMyClass

И дальше как-то рулить с указателями?
пыщь
JTG вне форума Ответить с цитированием
Старый 14.11.2007, 21:00   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

по моему размер данных класса это <объект>.InstanceSize
справка Delphi:
Цитата:
Description
InstanceSize indicates how many bytes of memory are required for a class’s instance data. InstanceSize is called from methods that allocate and deallocate memory. InstanceSize is not a virtual method, so it cannot be overridden. InstanceSize should be called only when implementing a custom version of NewInstance.

Последний раз редактировалось rpy3uH; 14.11.2007 в 21:18.
rpy3uH вне форума Ответить с цитированием
Старый 14.11.2007, 21:40   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Восклицание

для rpy3uH:

см. #6

для JTG:

Да не могу я через
Цитата:
PMyClass = ^TMyClass;
Говорю же, куча этих классов и не мои они и в разных модулях лежат и параллельно разрабатываются. А мне вот вынь да полож единый способ определения размера объекта. Такой вот я тихий извращенец.

Постараюсь решить через

Код:
...
  vmtTypeInfo
  vmtFieldTable
...
Есть такое в System.

Последний раз редактировалось Вадим Мошев; 14.11.2018 в 15:20.
Sibedir вне форума Ответить с цитированием
Старый 15.11.2007, 12:26   #9
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Хм... а почему 20 байт не верно?) Вроде всё верно...
integer = 4 байта
real = 8 байт
string = 4 байта (как указатель)
Итого: 4+4+8=16 байт.
Ну, ещё 4 байта осталось...
Моё мнение - это указатель самого обёкта.
Вот в 20 и уложились
zetrix вне форума Ответить с цитированием
Старый 15.11.2007, 20:17   #10
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от zetrix Посмотреть сообщение
Ну, ещё 4 байта осталось...
Моё мнение - это указатель самого обёкта.
Вот в 20 и уложились
так и есть - это поле Self
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить размер объекта Comment Васкинс Microsoft Office Excel 4 16.07.2008 14:11
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
Как найти размер папки! vitalik007 Общие вопросы Delphi 6 02.02.2008 14:29
Принадлежность объекта по координатам Angel_CJ Помощь студентам 9 12.09.2007 18:43
Свойства объекта KBak Win Api 5 15.08.2007 20:21