一.ML
陈云Pytorch
1.各框架简述
- Theano: 已停止开发,不建议学习
- TensorFlow: 不完美,最流行,社区完善,适合生产
- Keras: 入门简单,过度封装不灵活
- Caffe(2): 文档不完善,性能优异,适合生产
- MXNet: 文档混乱,分布式性能强大,适合云平台
- CNTK: MS内部使用,社区弱,文档难,性能无短板,擅长语音
二.cpp
1. log4cpp
#define prefix(msg) string("[").append(__FILE__)\
.append(":").append(__func__)\
.append(":").append(std::to_string(__LINE__))\
.append("] ").append(msg).c_str()
#define LogWarn(msg) Mylogger::getInstance()->warn(prefix(msg));
#define LogError(msg) Mylogger::getInstance()->error(prefix(msg));
#define LogInfo(msg) Mylogger::getInstance()->info(prefix(msg));
#define LogDebug(msg) Mylogger::getInstance()->debug(prefix(msg));
标准接口接收可变参数:string类型内的%d与%s等会指向未知地址?
Mylogger::getInstance()->warn("hello,warn, %d");
2.运算符重载方式选择
3.类型转换函数
在源类內定义成员函数,函数形式没有参数与返回值,必须在函数体内return目标对象,类似运算符
4设计模式之 Pimpl
PIMPL ( Private Implementation 或 Pointer to Implementation )是通过 一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。 PIMPL 又称 作“编译防火墙”,它的实现中就用到了嵌套类。 PIMPL 设计模式有如下优点:
-
提高编译速度;
-
实现信息隐藏;
-
减小编译依赖,可以用最小的代价平滑的升级库文件;
-
接口与实现进行解耦;
-
移动语义友好。
使用内部类/嵌套类,使用::域操作符标识
区别于派生类,概念不同
将其置于private区域则隐藏于域外,仅能由外部类成员访问
pimpl 用法背后的思想是把客户与所有关于类的私有部分的知识隔离开。由于客户是依赖于类的头文件的,头文件中的任何变化都会影响客户,即使仅是对私有节或保护节的修改。pimpl用法隐藏了这些细节,方法是将私有数据和函数放入一个单独的类中,并保存在一个实现文件中,然后在头文件中对这个类进行前向声明并保存一个指向该实现类的指针。类的构造函数分配这个pimpl类,而析构函数则释放它。这样可以消除头文件与实现细节的相关性。
以上转自https://blog.csdn.net/ma12an/article/details/7491893
5.单例模式自动释放
利用全局变量在程序结束时自动析构的特性
利用类內类可以访问外类的私有成员的特性
通过重载类中类的析构函数
使全局静态类中类对象在程序结束时,调用析构,完成单例对象的释放
https://blog.csdn.net/Johnable/article/details/103669531
!多线程不一定安全,解决方案:
加锁/饿汉模式/atexit:在getinstance时注册析构函数
线程安全:pthread_once(init)
init(getInstance+atexit(destory))