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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2017, 13:29   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию узнать, сколько памяти занимает класс

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Imaging.jpeg;

type
  TMyClass = class(TObject)
    public
      bmp : TBitmap;
      jpg : TJPEGImage;
      i : integer; //4 байта
      w : word; //2 байта
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
    a : TMyClass;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  A := TMyClass.Create;
  a.bmp := TBitmap.Create;
  a.bmp.LoadFromFile('c:\2.bmp');
  a.jpg := TJPEGImage.Create;
  a.jpg.LoadFromFile('c:\1.jpg');
  Caption := IntToStr(a.InstanceSize);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  a.bmp.Free;
  a.jpg.Free;
  a.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  r : TRect;
begin
  SetRect(r,0,0,200,200);
  Canvas.StretchDraw(r,a.bmp);
  SetRect(r,200,0,500,200);
  Canvas.StretchDraw(r,a.jpg);

end;

end.
Можно как-то узнать, сколько памяти занимают все объекты класса? Не указатели, а именно сами объекты. В интернете нагуглил, что вроде как нельзя. Хочу от вас подтверждение, либо опровержение.
Код:
  Caption := IntToStr(a.InstanceSize);
Выдаёт только размер указателей.

p.s. Пока это писал, заметил что если объявить в классе переменную типа Word или SmallInt, то размер увеличивается не на 2, а на 4 байта. Почему? Это ведь 16-битные числа. Или целочисленная переменная в 32-битном процессе это всегда 4-байтный указатель?
то есть
Код:
var
  i : byte;
Это 4 байта на указатель + 1 байт на значение? Правильно?

Последний раз редактировалось BLACK_RAIN; 03.07.2017 в 13:31.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.07.2017, 13:56   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
заметил что если объявить в классе переменную типа Word или [/b]SmallInt[/b], то размер увеличивается не на 2, а на 4 байта. Почему? Это ведь 16-битные числа.
а попробуйте добавить подряд(!) две-три "маленьких" переменных и посмотрите на память.

Цитата:
Это 4 байта на указатель + 1 байт на значение? Правильно?
нет это ровно один байт, НО ...
последующие данные КАК ПРАВИЛО оптимально размещать на границе слова. 32-битное выравнивание. И значит 3 байта в пролёте.

Цитата:
В интернете нагуглил, что вроде как нельзя. Хочу от вас подтверждение, либо опровержение.
почему же нельзя написать
Код:
TmyClass =class
public
  function GetExtInstance: integer;
end;

function TMyClass.GetExtInstance: integer;
begin
  result:=self.GetInstance  //сколько занимает САМ класс
// и ЕГО "вложенные" классы 
           + self.bmp.GetInstance
           + self.jpg.GetInstance;
end;
только вот это НЕ ЕСТЬ непрерывный кусок памяти.
и НИКТО НЕ ГАРАНТИРУЕТ что внутри классов нет еще ссылок(указателей) на другие классы.
более того почти наверняка они есть.
не видно смысла в "универсальном" подсчете.

А если учесть, что многие объекты имеют ссылку на ОДИН и тот "собственнический" объект.
TCollection
TCollectionItem.Collection
то как считать здесь???
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.07.2017, 14:07   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
только вот это НЕ ЕСТЬ непрерывный кусок памяти.
и НИКТО НЕ ГАРАНТИРУЕТ что внутри классов нет еще ссылок(указателей) на другие классы.
более того почти наверняка они есть.
не видно смысла в "универсальном" подсчете.

А если учесть, что многие объекты имеют ссылку на ОДИН и тот "собственнический" объект.
TCollection
TCollectionItem.Collection
то как считать здесь???
Мне надо просто создать несколько экземпляров класса со всеми его объектами и вывести на экран сколько каждый экземпляр занимает памяти.
То есть, правду пишут, что никак нельзя?
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.07.2017, 14:36   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

что есть память занимаемая объектом?

Вар1. экземпляр занимает ровно столько, сколько выделено памяти для хранения ВСЕХ данных, включая ВСЕ внутренние объекты (указатели(ссылки), массивы(по сути те же ссылки), строки( это те же ссылки) .... )
Цитата:
То есть, правду пишут, что никак нельзя?
для ПОЛНОСТЬЮ известного ТЕБЕ класса можно подсчитать (см пример выше GetExtInstance).

Вар 2. классический!!!
память занимаемая непосредственно САМИМ объектом.
без учета ссылочных объектов (ну кроме учета размера самой ссылки), поскольку это на самом деле ОТДЕЛЬНЫЕ (и самостоятельные!) объекты и всего навсего ИСПОЛЬЗУЕМЫЕ нашим.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.07.2017, 14:55   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

По теме ясно. Нативного способа нет. Вопрос исчерпан.
Цитата:
Сообщение от evg_m Посмотреть сообщение
self.GetInstance
Это что за метод такой? Мне компилятор пишет, что нету такого.
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.07.2017, 15:15   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Это что за метод такой? Мне компилятор пишет, что нету такого.
неверное "цитирование" вот этого
Цитата:
Код:
 Caption := IntToStr(a.InstanceSize);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
webbrowser при обновлении страницы занимает больше оперативной памяти КатяСаша Общие вопросы Delphi 10 01.11.2016 18:44
Как узнать сколько сводных таблиц и сколько срезов на рабочем листе? RISagitov Microsoft Office Excel 0 31.10.2015 19:30
Определить, сколько места занимает программа в памяти kolian87 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 26.01.2015 07:47
Как узнать с какого по какой адрес занимает процесс в системе. kalexi Win Api 2 30.03.2008 15:48
Количество оперативной памяти которое занимает программа werser Помощь студентам 1 03.02.2008 02:22