因为工作原因需要引入base库,我作为新人则挑起了这个活,拿出工作中的一些时间来学习base库,主要关注其实现原理,使用方法,注意事项,特点,优缺点。
本文持续更新
2016/10/8 第一次更新
AtExitManager
类似于linux下的atexit
,注册退出清理函数,不过base库的实现机制是利用了C++的RAII
。
void exit_first(void *data) { LOG(INFO) << "first"; }
void exit_last(void *data) { LOG(INFO) << "second"; }
void exit_task(void *data) { LOG(INFO) << "use bind"; }
class task {
public:
void func() { LOG(INFO) << "task::func"; }
};
int main() {
base::AtExitManager manager; //这个对象在析构的时候,会去回调注册的callback
task tsk;
base::AtExitManager::RegisterCallback(&exit_first, nullptr); //注册callback
base::AtExitManager::RegisterCallback(&exit_last, nullptr);
base::AtExitManager::RegisterTask(base::Bind(&exit_task, nullptr)); //指出注册base::Bind绑定的callback
base::AtExitManager::RegisterTask(
base::Bind(&task::func, base::Unretained(&tsk)));
// This method can take the initiative to register callback functions
base::AtExitManager::ProcessCallbacksNow(); //可以自己主动的调用
return 0;
}
atomicops
对C++11的std::atomic
的封装,默认情况下C++11的std::atomic
是SC
(sequence consistent)顺序一致性模型的,也就是内部做了Barrier(有性能损耗),但是大多数场景下我们只是想使用atomic特性,因此base针对不同的内存模型进行了封装,有NoBarrier
,Barrier
,accquire
,release
等等。AutoReset
给全局变量提供默认值和新值,等AutoReset
析构了,就会恢复默认值base64
和base64url
提供了对url场景和一般场景下的base64编码,具体可以参考RFC-4648BigEndian
一个大端序的bytesbuf。GetBuildTime
通过在build的时候,生成一个带有编译时间的常量的头文件,可以通过这个头文件得到二进制程序的编译时间。Bind/CallBack
和std::bind
&std::function
类似,Google提供了使用文档和设计文档,说明了自己为何没有使用std标准库,而是自己造轮子的原因callback。bits
提供了对字节对齐大小的计算,还有计算一个数是2的几次方相关的函数。bind_helpers
类似于std::ref
,默认的std::bind
是将参数拷贝后再绑定,可以使用std::ref
通过传引用的方式绑定,bind_helper
提供了更丰富的传参方式,传引用,传值,所有权转移等。BarrierClosure
类似于java的CountDownLatch
,需要传一个次数和callback函数,每调用一次次数就减1,直到最后一次才会真正的调用callback函数。Reversed
可以O(1)复杂度翻转容器中的元素,本质上并不是真正的翻转,只是改变了begin()和end()的含义,该函数返回一个迭代器类型,只不过其begin()
返回的是容器的rbegin()
,end()
返回的是容器的rend()
。hash_table
/