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