Если я объявляю, что объект быть подклассом дескриптора classdef obj <обрабатывает мой объект, теперь по существу "указатель" на некоторую память где-нибудь. Как я узнаю, сколько памяти мой объект израсходовал?
Например, скажите, что у меня есть нечто класса с полевой панелью
classdef foo < handle
properties
bar = randn(1000);
end
панель поднимает 8 мегабайтов (8 байтов * 1 миллион чисел)
но если я ввожу
obj = foo();
whos('obj');
Я добираюсь
Name Size Bytes Class Attributes
obj 1x1 60 foo
Как я узнаю, на какое количество указывает общая память obj?
В качестве хака преобразуйте ее в структуру и посмотрите, сколько места она займет. Я думаю, что все данные будут выставлены в "обычных" полях объекта.
f = foo();
origWarn = warning();
warning off 'MATLAB:structOnObject'
s = builtin('struct', f); % use 'builtin' in case @foo overrides struct()
warning(origWarn);
Тогда вы можете увидеть это в whos.
>> whos
Name Size Bytes Class Attributes
f 1x1 60 foo
s 1x1 8000124 struct
Это всего лишь первое приближение. Он скажет вам, сколько памяти используют его поля. Если какой-либо из них содержит объекты-дескрипторы, вам необходимо выполнить рекурсию вниз по полям этой структуры и преобразовать любые другие объекты-дескрипторы в структуру для подсчета их полей. (Если вы хотите включить память объектов Java, вам также понадобится отдельная функция для оценки размера их хранилища. Вероятно, не стоит беспокоиться.) Теперь, когда в Matlab есть замыкания, дескрипторы функций также могут содержать данные; вам нужно будет подключиться к тем, кто использует functions (), если вы хотите подсчитать закрытые данные.
Если вы работаете с объектами-дескрипторами, у вас могут быть псевдонимы и даже циклические ссылки на уровне M-кода, поэтому вам нужно следить за этим при рекурсии. (Извините, я не знаю, как справиться с этим в новой системе объектно-ориентированного программирования.)
Отображение памяти в whos также будет дважды подсчитывать массивы, которые совместно используют память с помощью оптимизации копирования при записи в Matlab. Вот конкретный пример.
x = NaN(1,10000);
s.x = x;
s.y = x;
s.z = x;
>> whos
Name Size Bytes Class Attributes
s 1x1 240372 struct
x 1x10000 80000 double
На самом деле s потребляет всего около 80 КБ; он просто содержит три указателя на x. И эти 80 КБ - это те же 80 КБ, которые потребляет сам x. Если вы не измените какой-либо из них; затем выделяется новый массив. Whos () не позволит вам различать эти случаи. Справиться с этим сложно; AFAIK единственный способ сделать это - использовать файл MEX для получения указателя (ей) данных mxarray и самостоятельно пройти по дереву объектов, обнаруживая указатели с псевдонимом и подсчитывая байты с псевдонимом.
Это общая проблема с измерением размера объектов в памяти, когда их компоненты могут использоваться совместно. Это не отдельные физические объекты. По крайней мере, вы не в C, работая с указателями на произвольные блоки памяти.