Mex文件和内存管理

时间:2015-01-23 22:30:26

标签: matlab memory mex

我有一个mex代码,其中输出变量与输入变量具有相同的名称,但是由于mex代码的操作,它会改变大小。例如,我有类似的东西:

A =函数(A)其中输入中的A是100 X 1向量(在我的模拟中大得多),输出A是50 X 1向量。我想了解在这种情况下如何管理内存。操作完成后,A现在占用50 X 1的空间,其余的可以自由分配给其他变量吗?

谢谢!

亚洲时报Siddharth

1 个答案:

答案 0 :(得分:2)

这是正确的,原始A的数据缓冲区被MATLAB破坏并创建了一个新缓冲区(相同的mxArray结构地址可能会被重新使用,大概是通过将新的地址复制到原始地址之后解除分配原始数组的数据缓冲区)。 这假设您在您的MEX文件中写入prhs[i]

您可以使用format debug查看此信息。您将观察到输出mxArray具有相同的地址,但它的数据缓冲区具有不同的地址,因此它已明确重新分配输出数组。这表明原始缓冲区已解除分配或排队等待解除分配。

从更改的输出开始,文件testMEX.mexw64取出输入数组第一行的前半部分并将其复制到新数组中:

>> format debug
>> A = rand(1,8)
A =

Structure address = efbb890
m = 1
n = 8
pr = 77bb6c40
pi = 0
    0.2581    0.4087    0.5949    0.2622    0.6028    0.7112    0.2217    0.1174
>> A = testMEX(A)
A =

Structure address = efbb890
m = 1
n = 4
pr = 77c80380
pi = 0
    0.2581    0.4087    0.5949    0.2622

请注意pr 不同,这意味着MATLAB已经创建了一个新的数据缓冲区。但是,mxArray"结构地址"是一样的。因此,至少会释放旧的数据缓冲区。原始mxArray结构是否只是变异或是否创建了新的mxArray是另一个问题(见下文)。


修改:以下是一些证据表明创建了一个全新的mxArray并将其复制到旧的mxArray

将以下两行添加到MEX功能中:

mexPrintf("prhs[0] = %X, mxGetPr = %X, value = %lf\n", 
    prhs[0], mxGetPr(prhs[0]), *mxGetPr(prhs[0]));
mexPrintf("plhs[0] = %X, mxGetPr = %X, value = %lf\n", 
    plhs[0], mxGetPr(plhs[0]), *mxGetPr(plhs[0]));

结果是:

prhs[0] = EFBB890, mxGetPr = 6546D840, value = 0.258065
plhs[0] = EFA2DA0, mxGetPr = 77B65660, value = 0.258065

显然,EFA2DA0上的临时mxArray 包含输出(plhs[0]),此mxArray标头/结构完全复制到旧{{ {1}}结构(基础MATLAB工作空间中的mxArray)。在发生此复制之前,MATLAB肯定会在A

处释放数据缓冲区

<强> testMEX.cpp

6546D840