matlab - MATLAB 中的 Copy-on-Write 和 varargin

标签 matlab memory memory-management copy-on-write

MATLAB 文档的 Avoid Unnecessary Copies of Data 部分包含以下语句:

Copy-on-Write

If a function does not modify an input argument, MATLAB does not make a copy of the values contained in the input variable.


在这种情况下,没有关于 varargin 的词。我试图制定一个能够监控内存使用情况的函数,但没有成功。所以我在这里问:写时复制功能是否适用于 varargin?
假设函数 function Y = f(x,y,z) 与函数 function Y = f(varargin) 。在第一种情况下,函数调用 f(a,b,c) 不会复制 abc (无论变量的类型如何)。在第二种情况下,函数调用 f(a,b,c) 的行为不清楚。 MATLAB 会指出 varargin{1}avarargin{2}bvarargin{3}c 而不显式创建元胞数组,还是 vararginabc 的显式串联(因此数组中的三个内存变量将存储元胞数组)?

最佳答案

varargin 是一个元胞数组。当您将对象放入元胞数组时,该对象并未真正被复制,但其引用计数会增加:

a = [1 2 3];
b = 5;
c = {4, 6};
varargin = {a,b,c};
这里只是增加了 abc 指向的对象的引用计数。当你这样做时:
varargin{1}(2) = 7;
因为它想写入 a 指向的对象,所以它会复制该数组对象并将新数组的第二个元素设置为 7 。新数组放置在 varargin 的第一个单元格中,并且 a 指向的对象的引用计数减少。但是,MATLAB jit 编译器可能会进行更多优化,并且可能会就地创建变量,因此根本不会创建元胞数组。另一种可能的优化可能与标量等小对象有关。它们是廉价的对象,可以廉价地复制,而且它们可能没有引用计数。

关于matlab - MATLAB 中的 Copy-on-Write 和 varargin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65690681/

相关文章:

matlab - 寻找近邻

ios - 当我在 iOS 中收到内存警告时,内存使用阈值是多少

c++ - 最大化内存使用

c - &address + sizeof(type) 和 &address + 1 有什么区别?

algorithm - 整数线性规划 (ILP) 的运行时间复杂度是多少?

matlab - 将多个排名相加得出不同权重的总排名

matlab - 在MATLAB中查找已编译应用的路径

java - 不打死马 : running five "Hello World" java apps uses 700MB of RAM

java - 如何使用 JVMTI 获取 java 对象的内存地址(不是哈希码)

将堆栈内存用于不完整结构的 C 最佳实践