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)
不会复制 a
、 b
和 c
(无论变量的类型如何)。在第二种情况下,函数调用 f(a,b,c)
的行为不清楚。 MATLAB 会指出 varargin{1}
到 a
、 varargin{2}
到 b
和 varargin{3}
到 c
而不显式创建元胞数组,还是 varargin
是 a
、 b
和 c
的显式串联(因此数组中的三个内存变量将存储元胞数组)?
最佳答案
varargin
是一个元胞数组。当您将对象放入元胞数组时,该对象并未真正被复制,但其引用计数会增加:
a = [1 2 3];
b = 5;
c = {4, 6};
varargin = {a,b,c};
这里只是增加了 a
、 b
和 c
指向的对象的引用计数。当你这样做时:varargin{1}(2) = 7;
因为它想写入 a
指向的对象,所以它会复制该数组对象并将新数组的第二个元素设置为 7
。新数组放置在 varargin
的第一个单元格中,并且 a
指向的对象的引用计数减少。但是,MATLAB jit 编译器可能会进行更多优化,并且可能会就地创建变量,因此根本不会创建元胞数组。另一种可能的优化可能与标量等小对象有关。它们是廉价的对象,可以廉价地复制,而且它们可能没有引用计数。
关于matlab - MATLAB 中的 Copy-on-Write 和 varargin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65690681/