Если вы хотите, чтобы ваш класс имел ссылочную семантику, тогда да, вам нужно использовать класс handle, а не класс значений.
Но обратите внимание, что, хотя по умолчанию MATLAB передает аргументы по значению, он также использует ленивое копирование или копию на записи, поэтому копия только сделанное из входных аргументов, если входные аргументы должны быть изменены. Кроме того, если входной аргумент представляет собой структуру или объект, копия производится только из частей (полей, свойств), которые необходимо изменить.
А также дополнительно, MATLAB имеет в месте оптимизации таким образом, что если выходной аргумент такой же, как входной аргумент, и операции на входной аргумент может быть сделано на месте, то копия не требуется.
Так, к примеру, рассмотрим следующую функцию:
function y = timestwo(x)
y = 2*x;
Если вы начинаете с переменной a
в базовом рабочем пространстве (скажем, это очень большой массив удваивается) и вызвать b = timestwo(a)
, копия не является из a
, так как x
не изменяется во время работы. Использование памяти увеличивается только при назначении выходного аргумента y
.
Но рассмотрим эту функцию:
function y = timestwoconj(x)
x = x';
y = 2*x;
теперь увеличивается использование памяти во время выполнения функции, так как копия сделана из x
, как он изменяется. Такое же пространство выделяется, когда вычисляется y
, а затем, когда функция выходит из временной копии x
, очищается.
Это иллюстрирует копию поведения записи.
Рассмотрит также следующую функцию:
function x = timestwo(x)
x = 2*x;
Здесь выходной аргумент таким же, как входной аргумент, и все операции могут быть сделаны на месте. Если вы звоните a = timestwo(a)
, копия вообще не производится, а использование памяти не увеличивается. Это иллюстрирует оптимизированное поведение на месте.
Попробуйте реализовать некоторые функции, аналогичные приведенным выше, применив их к большому массиву, а затем пропустив их в отладчике по очереди при просмотре использования памяти в диспетчере задач - вы получите эту идею.
При реализации классов значений в MATLAB вы обычно используете синтаксис для своих методов, таких как function obj = myfun(obj, value)
, а не function myfun(obj, value)
. Методы имеют такой же способ работы, как описано выше, поэтому ваш объект будет скопирован только в том случае, если вы изменяете его во время метода.
Когда вы работаете с классами значений, это то, что вы хотите сделать - если вам нужна эталонная семантика, используйте класс дескриптора.
Надеюсь, что это поможет!
это документировано? – Lee
@Lee Биты о классах дескриптора и значения явно документированы. Биты о методах копирования и записи на месте оптимизируются как документально, но не очень четко или явно (например, я не думаю, что в документе есть отдельная страница, посвященная любой теме). –