gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:49:42 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com