如果工程中存在malloc/free等频繁动态分配和释放内存的情况,一般优化思路是:
方法1:加内存池
方法2:使用全局buf
方法1的优点:众所周知,不详细说了。
方法2使用场合:整个工程运行过程中,动态分配的内存大小有规律性且有最大个数。可以在工程起始阶段就分配足够的全局buf。
内存池前面文章有实现代码,这里说下支撑方法2实现的主要技术:那就是全局变量的使用方法。
Step1:
opt.h中用extern声明全局buf变量,只声明但不定义!
重要的一行代码是:extern unsigned char* ge_pucBuf;
#ifndef _H_OPT_H__
#define _H_OPT_H__
extern unsigned char* ge_pucBuf;
void initBuf(unsigned char* pucBuf);
void DeinitBuf();
#endif
Step2:在opt.cpp中不用extern再声明一次,并提供定义全局变量的对外接口
opt.cpp中提供定义全局buf变量的方法,供工程起始阶段调用一次,实现全局buf变量的定义。
重要的一行代码是:unsigned char* ge_pucBuf;
#include "./opt.h"
#include <stdlib.h> //for malloc
unsigned char* ge_pucBuf;
static unsigned int gs_uiBufLen = 0;
void initBuf(unsigned char* pucBuf, unsigned int uiBufLen)
{
if (0 == gs_uiBufLen)
{
ge_pucBuf = pucBuf;
gs_uiBufLen = uiBufLen;
}
}
void DeinitBuf()
{
if (gs_uiBufLen)
{
free(ge_pucBuf);
ge_pucBuf = NULL;
gs_uiBufLen = 0;
}
}
Step3:整个项目工程起始阶段代码中调用全局buf变量的定义接口,即为全局buf分配内存
比如init.cpp中init()方法是初始化整个工程,则可以如下完成全局buf的定义:
void init()
{
unsigned char* buf = (unsigned char*)malloc(1024);
initBuf(buf, 1024);
}
Step4:在工程中的其他文件中就可以共同使用opt.h中的全局buf变量了。
全局buf变量在多个文件中的使用,就需要编码人员自己维护好了,不详细多说。
比如在a.cpp中使用opt.h中全局buf变量的方法:
//a.cpp
#include "opt.h"
void printGlobalBufAddr()
{
printf("%s:%#x\n", __FUNCTION__,ge_pucBuf);
}
在b.cpp中使用opt.h中全局buf变量的方法:
//b.cpp
#include "opt.h"
void printGlobalBufAddr()
{
printf("%s:%#x\n", __FUNCTION__,ge_pucBuf);
}
。
到此用4句话总结就是:
第一句话:global_var.h 用extern声明全局变量
extern unsigned char* ge_pucBuf;
void init(unsigned char* pucBuf);
第二句话:global_var.cpp 不用extern再声明一次全局变量,并实现全局变量的定义函数
unsigned char* ge_pucBuf;
void init(unsigned char* pucBuf)
{
ge_pucBuf = pucBuf;
}
第三句话:工程起始初始化函数中调用定义全局变量的方法完成全局变量的定义
#include "global_var.h"
void prj_init()
{
unsigned char* pucBuf = (unsigned char*)malloc(1024);
init(pucBuf)
}
第四句话:工程中a.cpp、b.cpp、c.cpp、d.cpp等文件可以使用
//a.cpp 或者b.cpp c.cpp d.cpp
#include "global_var.h"
void useGlobalVar()
{
printf("%#\n", ge_pucBuf);
}
(end)