我正在尝试让我的mex库避免所有内存分配甚至是什么
到目前为止,mex得到了一个输入,使用mxCreate...()
创建了一些矩阵并返回了这个输出
但是现在我想修改这个界面,以便mex本身不会进行任何分配
我的想法是mexFunction将输入矩阵以填充值并将此非常相同的矩阵作为输出返回。
这应该是可能的吗?
让我思考的轻微警报,如果这是我需要做的事情,那就是左手参数作为const来到mexFunction,而右手参数是非const。要将输入矩阵作为输出返回,我需要删除此const。
答案 0 :(得分:5)
修改右手参数是个坏主意。这些输入可以被引用计数,如果你在引用计数大于1时修改它们,那么你也将默默地修改存储在其他变量中的值。
不幸的是,鉴于现有的MEX API,我认为没有办法做你想做的事。
答案 1 :(得分:5)
有趣的是,前几天我只是看着这个。我找到的最佳信息是帖子here和here以及this。
基本上,它在Matlab世界中通常被认为是一件非常糟糕的事情......但与此同时,没有什么能阻止你,所以你可以做到 - 尝试一些简单的例子,你会发现变化是传播的。只需更改从prhs获得的数据(您不需要返回任何内容 - 因为您更改了原始数据,它将反映在工作区中的变量中)。
然而正如链接中指出的那样,由于Matlabs的写时复制语义,这可能会产生奇怪的后果。设置format debug
对于获得直觉有很大帮助。如果你执行a=b
,那么你会看到a和b有不同的'结构地址'或标题,表示它们是不同的变量,但数据指针pr指向内存中的同一区域。通常,如果在Matlab中更改y,则写入时复制将启动并在更改之前复制数据区域,因此在y具有新数据指针之后。当你改变mex中的东西时,这不会发生,所以如果你改变y,x也会改变。
我认为这样做是可以的 - 如果您需要处理大型数据集,它非常有用,但您需要留意任何奇怪的事情 - 尽量确保您输入的数据不会在变量之间共享。结构和单元格数组的事情变得更加复杂,所以我更倾向于避免这样做。