В Модели Объекта C++ Stan Lippman. Это заставило C++ наконец "нажать" для меня, прежде чем это было все "волшебство". Эта книга дала мне различное настроение при приближении к новому языку программирования.
По моему опыту, при условии, что ни один код не изменяет большие данные, использование памяти одинаково, независимо от того, используете ли вы глобальную переменную или входной аргумент, как говорится в документации Matlab. . Дополнительная информация содержится в сообщении в блоге сотрудника MathWorks.
Существует довольно много фольклора о проблемах производительности в Matlab, и не все из них правильные. Внутреннее устройство Matlab немного изменилось. Возможно, в предыдущей версии лучше использовать глобальную переменную.
Этот ответ может быть несколько косвенным, но здесь стоит упомянуть еще одну тему - использование вложенных функций для управления памятью.
Как уже было установлено в другие ответы, нет необходимости в глобальных
переменных, если данные, которые вы передаете функции, не изменяются (поскольку они будут переданы по ссылке). Если он изменен (и, таким образом, передается по значению), использование глобальной переменной
вместо этого сэкономит вам память. Однако глобальные
переменные могут быть несколько "неотесанными" по следующим причинам:
global varName
везде, где они вам нужны. clear global
, которая очищает все глобальные переменные. Альтернатива глобальным
переменным была упомянута в первом наборе документации, который вы процитировали : вложенные функции. Сразу после цитированной вами цитаты приводится пример кода (который я здесь немного отформатировал):
function myfun
A = magic(500);
setrowval(400, 0);
disp('The new value of A(399:401,1:10) is')
A(399:401,1:10)
function setrowval(row, value)
A(row,:) = value;
end
end
В этом примере функция setrowval
вложена внутри функции ] myfun
. Переменная A
в рабочей области myfun
доступна в setrowval
(как если бы она была объявлена глобальной
в каждом из них). Вложенная функция изменяет эту общую переменную, таким образом избегая выделения дополнительной памяти. Вам не нужно беспокоиться о том, что пользователь случайно что-то очистит, и (на мой взгляд) это немного чище и проще, чем объявление глобальных
переменных.
Решение мне кажется немного странным. Как вы уже выяснили, это не должно существенно влиять на использование памяти, если вызываемая функция не изменяет массив данных. Однако,
Думаю, вы в значительной степени ответили на свой вопрос, но здесь было бы неплохо еще пара ссылок:
Я снял видео по этому поводу:
http: //blogs.mathworks .com / videos / 2008/09/16 / new-location-and-memory-allocation /
Подобно тому, о чем здесь говорила Лорен:
http://blogs.mathworks.com/loren/2006/05 / 10 / управление-памятью-для-функций-и-переменных /
-Dogu