init/deinit
初始化/去初始化函数根据作用域可以分为几种不同的应用情形
1. 全局初始化/去初始化
这一次运行程序只做这一次初始化/去初始化
2. 模块初始化/去初始化
每次加载/卸载这个模块都调用一次初始化/去初始化
全局初始化
以ffmpeg为例 需要首先调用av_register_all接口注册所支持的编解码器等等
一般只需要程序运行时注册一次 程序退出前注销一次
全局初始化的简单实现:
#include <functional>
using namespace std;
class onceFunction {
public:
typedef function<void(void)> task;
onceFunction(const task &init, const task &deinit = nullptr){
if (init) {
init();
}
_destroyer = deinit;
}
virtual ~onceFunction() {
if (_destroyer) {
_destroyer();
}
}
private:
onceFunction &opeartor =(const onceToken &);
onceFunction();
task _destroyer;
};
static onceFunction gToken([](){
printf("onceFunction init\n");
},nullptr);
int main() {
printf("main function\n");
return 0;
}
执行结果:
onceFunction init
main function
全局初始化是利用静态全局变量生成的时机早于main函数执行实现
类构造时执行初始化 析构时执行去初始化
模块初始化
模块初始化的实现方法不止一种
比如C风格代码的flag写法
struct ctx{
int flag;
};
void ctx_init(struct ctx* ctx) {
if (flag) {
flag = false;
}
}
或者也可以把初始化和去初始化函数放在这个模块的类的构造/析构函数中执行