matlab mex中C++内存全局共享和持久化
为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库;
然而,经常情况下,在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++内存全局共享和持久化的更多相关文章
- 在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32
csunking贡献,2015-9-22 1712 1. 概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能 ...
- Innodb之全局共享内存
参考链接: https://blog.csdn.net/miyatang/article/details/54881547 https://blog.csdn.net/wyzxg/article/de ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
- 【转】Android中的内存管理--不错不错,避免使用枚举类型
原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...
- JavaScript中的内存泄漏以及如何处理
随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...
- 浅析JAVA中堆内存与栈内存的区别
Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则. 栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都 ...
- 风险指针(Hazard Pointer) 内存空间共享模型
WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...
- C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
随机推荐
- HDU 3533 Escape(BFS+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...
- 实习day2:@2X图片,git,coding.net,
@2X是5和6系列的图片,@3X是6P等大屏的图片 本公司目前只用@2X的图片适配. 比如20X27的图片 1x, 就是原始大小: 用2X, 就除以2,变成10X13.5: 如果用3X的, 就除以3, ...
- Django之管理权限
什么是权限: 谁对什么资源能做什么操作. 管理权限的实现有很多,这里实现一个最简单的管理权限的实现方式:rbac ( role based access control ) 实现的一个基本思路: ...
- csu 1553(RMQ+尺取法)
1553: Good subsequence Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 794 Solved: 287[Submit][Statu ...
- 洛谷 P1359 租用游艇 题解
题目传送门 这道题还是上模板啦~~SPFA大法好(本人还是懒得打邻接表) 一道橙题: 上代码: #include<bits/stdc++.h> using namespace std; ] ...
- js获取json对象中的key和value,并组成新数组
//比如有一个json var json = {"name" : "Tom", "age" : 18}; //想分别获取它的key 和 va ...
- HDU 6186 CS Course
保存前缀后缀. 保存一下前缀和后缀,去掉第$i$个位置,就是$L[i-1]$和$R[i+1]$进行运算. #include<bits/stdc++.h> using namespace s ...
- CodeForces 811C Vladik and Memorable Trip
$dp$. 记录$dp[i]$表示以位置$i$为结尾的最大值. 枚举最后一段是哪一段,假设为$[j,i]$,那么可以用$max(dp[1]...dp[j-1]) + val[j][i]$去更新$dp[ ...
- redis_NoSql入门概述
一.为什么要使用Nosql 今天我们可以通过第三方平台(如:google,facebook)可以很容易的访问和抓取数据.用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加. ...
- 批量 修改 android eclipse 项目名
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 最外层的 文件夹名字.