【效能優化】如何實現:c/c++整個專案工程使用一個全域性變數
如果工程中存在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)