为提高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++内存全局共享和持久化的更多相关文章

  1. 在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32

    csunking贡献,2015-9-22 1712 1.   概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能 ...

  2. Innodb之全局共享内存

    参考链接: https://blog.csdn.net/miyatang/article/details/54881547 https://blog.csdn.net/wyzxg/article/de ...

  3. 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 ...

  4. c++继承中的内存布局

    今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C ...

  5. 【转】Android中的内存管理--不错不错,避免使用枚举类型

    原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...

  6. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

  7. 浅析JAVA中堆内存与栈内存的区别

    Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则.     栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都 ...

  8. 风险指针(Hazard Pointer) 内存空间共享模型

    WiredTiger是一种高性能的开源存储引擎,现已在MongoDB中作为内模式应用.WiredTiger支持行存储.列存储两种存储模式,采用LSM Tree方式进行索引记录 WiredTiger支持 ...

  9. C++继承 派生类中的内存布局(单继承、多继承、虚拟继承)

    今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C ...

随机推荐

  1. MySQL-开发规范升级版

    一.基础规范 表存储引擎必须使用InnoDB   表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有 ...

  2. SPOJ D-query(莫队算法模板)

    题目链接:http://www.spoj.com/problems/DQUERY/ 题目大意:给定一个数组,每次询问一个区间内的不同元素的个数 解题思路:直接套莫队的裸题 #include<cs ...

  3. 关于Windows中的硬链接

    https://zhidao.baidu.com/question/748233720330351012.html linux中使用硬链接 ln a.txt b.txt 查看硬链接 ls -il 关于 ...

  4. base64的作用

    本函数将字符串以 MIME BASE64 编码.此编码方式可以让中文字或者图片也能在网络上顺利传输.在 BASE64 编码后的字符串只包含英文字母大小写.阿拉伯数字.加号与反斜线,共 64 个基本字符 ...

  5. scrollview和viewpager滑动冲突

    import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; i ...

  6. (10) go 错误

    没有 try catch..f.. 自定义错误

  7. URAL 1997 Those are not the droids you're looking for

    二分图的最大匹配. 每一个$0$与$1$配对,只建立满足时差大于等于$a$或者小于等于$b$的边,如果二分图最大匹配等于$n/2$,那么有解,遍历每一条边输出答案,否则无解. #include< ...

  8. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  9. DP 题集 2

    关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...

  10. Am335x U-boot LCD简易驱动

    参考此文档说明,自行添加相关代码: https://pan.baidu.com/s/1i5gLE89 相关代码: https://pan.baidu.com/s/1qXL8Bne 在文档说明第四步1中 ...