分配大块内存与list列表buffer关联的思考

原创 2013年07月21日 07:51:46
在wince下某软件工程中的数据流动流程大致如下,从采集到的数据,然后组包、滤波、已滤波包-->(分发)
1. 显示缓存、显示
2. 存储包、存储
3. 网络包、上传
4. 截屏
实际上要复杂些,这里只列举了主要的功能,工程中存在一个值得思考的问题,就是数据来回memory copy很频繁,IO开支不小。

因此希望分配一大块内存,它与list结构中的buffer关联,用队列方式来循环存储数据,不再过多的用memcpy,也可避免lock/unlock
主要测试代码实现如下:

二维数据内存分配:
char **darray_new(int row, int col, int size)
{
char **arr;
arr = (char **) malloc(sizeof(char *) * row + size * row * col);
TRACE(L"len = %d\n", sizeof(char *) * row + size * row * col);
if (arr != NULL)
{
char *head;
head = ((char *)arr + sizeof(char *) * row);
memset(arr, 0, sizeof(char *) * row + size * row * col);
while (row--){
arr[row] = head + size * row * col;
}
}
return arr;
}

void darray_free(char **arr)
{
if (arr != NULL)
free(arr);
}

#define ARRAY_ROW 5
#define ARRAY_COL 8 //与list个数相关
#define ARRAY_SIZE 4
struct ecgPack{
DWORD timestamp;
char **bufData;
};
list<ecgPack *> g_list;

char **g_arrayMem;

由于行业的特点,考虑到显示问题,ARRAY_ROW基本不变,实际应用中变化的是组包的个数list(用ARRAY_COL表示)

调用测试:

//包初始化

for(int i=0; i<ARRAY_COL; i++){
ecgPack *p = new ecgPack;
p->bufData = new char *[ARRAY_ROW];
g_list.push_back(p);
}
        //内存分配
g_arrayMem = darray_new(ARRAY_ROW, ARRAY_COL, ARRAY_SIZE);
int j=0;
char c = 0x0A;
list<ecgPack *>::iterator itr = g_list.begin();
while(itr!=g_list.end()){
ecgPack *p = (*itr);

for(int i=0; i<ARRAY_ROW; i++){
p->bufData[i] = &g_arrayMem[i][0+ARRAY_SIZE*j]; //buffer之间的关联
p->bufData[i][0] = c;  //测试数据
}
itr++;
j++;
c++;
}
//效果图,每一行代表的是波形显示数据,显示时只需要用知道当前数据移动的指针位置就可以, 避免数据在各个模块之间的流动,而是让各个模块在list中获取数据即可.
以上只是一个应用的初步想法,仅供参考


相关文章推荐

get_free_page分配大块内存空间

分配页内存的函数们:void *get_zeroed_page(unsigned int flags); ******分配一页内存,返回一个指向新页的指针并且对该页进行了清零操作 void *__g...

Linux内核最新的连续内存分配器(CMA)——避免预留大块内存 .

http://blog.csdn.net/21cnbao/article/details/7309757   在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,H...

Linux内核最新的连续内存分配器(CMA)——避免预留大块内存

转自:http://blog.csdn.net/21cnbao/article/details/7309757 在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,...

内核态用vmalloc申请大块内存

转载地址:http://www.diybl.com/course/6_system/linux/Linuxjs/20091020/179581.html 内核态用vmalloc申请大块内存  ...

大块物理地址连续的内存分配

  • 2014年04月03日 20:57
  • 281KB
  • 下载

Box2D源码学习(2)-b2BlockAllocator块内存分配

Box2D目录下主要包括四个文件夹, Collision-碰撞相关代码 Common-通用代码,包含块内存分配,栈内存分配,计时器等。 Dynamics-Box2D世界,物体,形状等定义 Rope-绳...

Java中非静态方法是否共用同一块内存?

将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance method 是否也会新增一份?答案是不会,我们...

慎用频繁小块内存申请,让程序健步如飞

最近碰到一个应用,为一块已经载入内存的Tab文件生成一个动态数组用于建立单元格数据索引表。当然这也算是C vs C++的一个典型例子吧。 由于事先不知道Tab文件的行数和列数,无法预先生成动态数组。方...
  • vipally
  • vipally
  • 2016年11月13日 14:40
  • 574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分配大块内存与list列表buffer关联的思考
举报原因:
原因补充:

(最多只允许输入30个字)