Ответ 1
Как взломать, преобразуйте его в структуру и посмотрите, сколько места занимает занятие. Я думаю, что все данные будут отображаться в "обычных" объектных полях.
f = foo();
origWarn = warning();
warning off 'MATLAB:structOnObject'
s = builtin('struct', f); % use 'builtin' in case @foo overrides struct()
warning(origWarn);
Затем вы можете увидеть его в чьих.
>> whos
Name Size Bytes Class Attributes
f 1x1 60 foo
s 1x1 8000124 struct
Это просто приближение первого порядка. Он расскажет вам, сколько памяти использует его поля. Если какой-либо из них содержит объекты дескриптора, вам нужно рекурсивно поместить поля этой структуры и преобразовать любые другие объекты дескриптора в struct для подсчета их полей. (Если вы хотите включить память объектов Java, вам также понадобится отдельная функция для оценки их размера хранилища. Вероятно, это не стоит беспокоить.) Теперь, когда Matlab имеет замыкания, дескрипторы функций также могут содержать данные; вам нужно будет использовать функции(), если вы хотите считать закрытые данные.
Если вы работаете с объектами handle, у вас могут быть псевдонимы и даже круговые ссылки на уровне M-кода, поэтому вам нужно будет следить за этим при рекурсии. (Извините, я не знаю, как справиться с этим в новой OO-системе.)
Дисплей памяти в 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 потребляет всего около 80K; он просто содержит три указателя на x. И это 80K - это тот же самый 80K, что и сам x потребляет. Если вы не модифицируете ни одно из них; то выделяется новый массив. Whos() не позволит вам дифференцировать эти случаи. Обработка этого затруднена; AFAIK единственный способ сделать это - использовать MEX файл для получения указателя (ов) данных mxarray и самостоятельно пройти дерево объектов, обнаруживать сглаженные указатели и подсчитывать псевдонимы.
Это общая проблема с измерением размера объектов в памяти, когда их компоненты могут совместно использоваться. Они не являются дискретными физическими объектами. По крайней мере, вы не на C, работая с указателями на произвольные блоки памяти.