Размер экземпляра рекурсивного класса в Delphi

Есть ли способ получить фактический размер экземпляра класса в 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 байта lengh (4 байта для служебных данных класса, 12 байтов из myOtherVar2 и еще 4 для myOtherVar1 integer). Использование InstanceSize приведет к 12 байтам для каждого из них, поскольку myOtherVar2 интерпретируется как указатель (4 байта) вместо ссылки на класс.

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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