Размер экземпляра рекурсивного класса в Delphi - PullRequest
3 голосов
/ 27 января 2009

Есть ли способ получить фактический размер экземпляра класса в Delphi?

Я знаю о методе InstanceSize класса TObject, но этот метод не рекурсивно вызывает себя для членов объекта. Например, скажем, у нас есть два класса:

type MyClass1 = class
  private
    myVar1 : integer;
    myVar2 : integer;
end;

type MyClass2 = class
  private
    myOtherVar1 : integer;
    myOtherVar2 : MyClass1;
end;

для этого сегмента кода, MyClass1 будет иметь длину 12 байтов (4 байта для каждого целого числа плюс 4 для служебной информации класса), а MyClass2 будет иметь длину 24 байта (4 байта для служебной информации класса, 12 байтов от myOtherVar2 и еще 4 для целого числа myOtherVar1). Использование InstanceSize приведет к получению по 12 байтов для каждого из них, поскольку myOtherVar2 интерпретируется как указатель (4 байта), а не как ссылка на класс.

Есть ли способ получить общий размер класса, включая его ссылку на другие экземпляры класса?

Ответы [ 5 ]

16 голосов
/ 27 января 2009

Создайте один объект MyClass1 и миллион MyClass2 так, чтобы каждый MyClass2 указывал на один и тот же MyClass1.

Сколько памяти занимает каждый MyClass2? 12,000012 байт?

Сколько памяти занимает круговой список? Бесконечность, как вы можете продолжать преследовать указатели навсегда?

В языках с указателями наивный рекурсивный алгоритм определения размера в общем случае бесполезен. Вам нужно написать свой собственный алгоритм, который включает в себя знания об агрегации / композиции, совместном использовании и рекурсивных ссылках, относящихся к тому, как вы используете объекты.

2 голосов
/ 06 апреля 2009

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

2 голосов
/ 27 января 2009

Есть ли способ получить общий размер класса, включая его ссылку в другие экземпляры классов?

Вы только что сказали это. Ссылка является указателем; его размер составляет 4 байта. Значение, возвращаемое InstanceSize - это количество байтов, выделенных для данных экземпляра класса.

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

1 голос
/ 27 января 2009

Звучит так, будто вы хотите посчитать память, используемую вашими объектами.

Если вам нужно это сделать, вы можете проверить, как это делает FastMM, и, возможно, подключить вашу процедуру, когда создаются объекты вашего типа.

Много работы с неясной целью; У вас должна быть веская причина, прежде чем начать.

1 голос
/ 27 января 2009

Нет, что вы хотите, не существует. Если вы хотите что-то подобное, вы должны написать это сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...