您的位置:首页 > Web前端

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

2013-07-21 07:51 337 查看
在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中获取数据即可.

以上只是一个应用的初步想法,仅供参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: