matlab mex中C++内存全局共享和持久化
2013-08-05 13:30
337 查看
为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库;
然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该问题提供了一种实现方案。
利用mex的C实现方案,为实时应用提供了解决方案。
然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该问题提供了一种实现方案。
利用mex的C实现方案,为实时应用提供了解决方案。
#include <mex.h> #include <matrix.h> //全局内存空间 static mxArray *persistent_array_ptr[128] = {NULL}; //初始化标记 static long int initialized[128] = {0}; //计数 static int cnt = 0; //当清理时的内存释放函数 void cleanup(void) { mexPrintf("MEX-file is terminating, destroying %d arraies\n", cnt); for(int i = 0; i < cnt; i++) if (initialized[i] != -1) mxDestroyArray(persistent_array_ptr[i]); } //mex入口 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { //最大内存共享总数 if (cnt >= 128) { mexPrintf("Error: More than 128 memory blocks.\n"); return; } //判断输入参数是否为0或1个 //为0:新分配共享内存 //为1:检索已分配的共享内存 if (nrhs > 1) { mexPrintf("UsageA: id = persis_ptr -- alloc new global memory.\n UsageB: persis_ptr id -- get allocated global memory information.\n"); return; } //内存分配 if (nrhs == 0) { mexPrintf("initializing, creating new array\n"); //创建持久化内存空间,这里仅分配一个实数空间 persistent_array_ptr[cnt] = mxCreateDoubleMatrix(1, 1, mxREAL); //以下函数保证了在mex调用完成后,内存空间在全局matlab内不被释放 mexMakeArrayPersistent(persistent_array_ptr[cnt]); //注册内存清理函数 mexAtExit(cleanup); //设置第cnt个内存初始化标记 initialized[cnt] = 1; //赋值 *mxGetPr(persistent_array_ptr[cnt]) = (cnt + 1)*2; cnt++; //返回内存块或句柄编号 nlhs = 1; plhs[0] = mxCreateDoubleScalar(cnt); } //检索已分配内存或句柄信息 else if (nrhs == 1) { char *val = mxArrayToString(prhs[0]); int id = atoi(val); if (id >= 1 && id <= cnt && initialized[id-1] == 1) { mexPrintf("get Information of No.%d = %f\n", id, *mxGetPr(persistent_array_ptr[id-1])); } else mexPrintf("cannot get information about No.%d memory block(total %d).\n", id, cnt); } }
相关文章推荐
- matlab mex中C++内存全局共享和持久化
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]
- ngx 全局变量共享内存
- 【转】C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
- C++内存管理__内存管理(栈、堆(new/delete)、自由存储区(malloc/freee)、全局/静态存储区、常量区)!堆栈内存管理方式的区别
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C/C++多文件共享全局变量时,使用extern的规范
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
- c++中共享内存操作函数解析(三)
- C++程序运行时内存布局之----------局部变量,全局变量,静态变量,函数代码,new出来的变量
- C++容器模板在共享内存中的使用
- C++跨文件共享全局变量
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]
- C++多文件共享全局变量
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- C++程序运行时内存布局之----------局部变量,全局变量,静态变量,函数代码,new出来的变量
- C/C++ 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区