Google之Chromium浏览器源码学习——base公共通用库(一)

时间:2023-03-08 20:56:06

  Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分。在研究、学习该项目前的时先获取到需要获取一份谷歌的Chromium源码,可参考:http://blog.****.net/kuerjinjin/article/details/23563059,若无法获取且打算使用VS IDE的可从此处下载:http://blog.****.net/kuerjinjin/article/details/23563059获取带有解决方案的源码,编译成功可能需要修改部分工程配置;因其源码后来有所改变,不过主要的部分内容变化不大,此外因学习需要不必要寻求最新版本的源码,此处将以采用Chromium39.0.2132.2版本作为参考;Chromium源码结构可参考:http://blog.****.net/blessyou312/article/details/6253050;

  因学习需要暂不先站在考虑高层次的角度,如设计模式、模型、线程进程等通信交互细节;只是作为初学者或是本人学习记录,从底层细节了解整个谷歌的Chromium源,后期将逐步学习高层次内容;此外google源码风格也是可以借鉴的,具体采用的编程、源码风格可根据自身爱好或是公司内部要求进行制定。

  拿到Chromium代码后,你会发现有很多*目录,其中的base库:为所有子工程共用的通用代码。它包括字符串操作、文件、线程、消息、内存管理等通用库,作为其他所有顶层工程间共用的东西。感兴趣的可以从中抽取该base库单独研究或是应用到自己的项目中,作为可用的公共库部分也是个不错的做法。因该工程内部内容比较零散,我们将按照模块划分的方式来了解、学习;先罗列其他文件依赖的最最基础的文件,然后针对各模块详细分析、学习。

  base_export.h:主要用以对不同的平台定义了导入和导出库相关的宏:BASE_EXPORT;该类宏将贯穿整个base库。

  basictypes.h:主要根据不同平台的支持声明定义变量类型的简单别名如typedef int  int32等;各种常用类型最大最小值变量定义(8、16、32、64位符号和无符号整数);宏声明DISALLOW_COPY、DISALLOW_ASSIGN、DISALLOW_COPY_AND_ASSIGN、DISALLOW_IMPLICIT_CONSTRUCTORS等在类的私有访问控制域中分别用以不可拷贝、不可赋值转让、不可拷贝和赋值以及既不可拷贝赋值和构造,默认的C++类都有拷贝功能和默认构造函数,很多时候我们会常常使用DISALLOW_COPY_AND_ASSIGN用以防止对象被拷贝与赋值转让,可防止因深浅拷贝等导致的指针释放等错误,DISALLOW_IMPLICIT_CONSTRUCTORS也可以达到此目的且可以防止默认的构造函数,常用在单例模式中,只允许一个实例的存在的情景下;简单辅助工具:arraysize,ARRAYSIZE_UNSAFE用以在编译器获取到对象数组的大小;类型转换:implicit_cast作为static_cast或const_cast向上转型的一个安全版本;编译期断言工具:COMPILE_ASSERT,其主要通过内部不可以负数作为数组的索引来判断;不同类型转换时按字节转化:bit_cast,替代reinterpret_cast转化时的会产生警告提示的情况,bit_cast内部采用memcpy,故可以很快转化;用在不需要返回返回值却有返回值的不安全情形:ignore_result,将忽视该返回值,实际上其内部函数体中什么也没有做;创建静态指针对象:CR_DEFINE_STATIC_LOCAL,该操作可能会产生内存资源泄露的情况,需要正常处理释放的操作,可以使用lazy_instance.h中的LazyInstance,可以安全的释放的资源,具体的原理是:在该静态类中含有一个静态的辅助对象,其负责删除该对象,释放资源。

  build_config.h:主要针对不同的平台定义相应的宏,用以编译时区分;包括操作系统:windows、mac、linux、POSIX系列,编译器:MSVC、GCC;以及处理器X86、X64等。

  port.h:主要针对不同的编译器,声明变量类型长整型、8、16、32、64位符号和无符号整数;在valist中使用前时:GG_VA_COPY,用以判断该类型是否支持拷贝(内部实际是一个简单的拷贝操作);在windows下调用API函数的约定方式:API_CALL宏,即__stdcall(参数是从右向左通过堆栈传递, 函数调用在返回前要由被调用者清理堆栈)。

  以后各模块排名不分主次,按照字母索引分别进行;下一篇将分析chrominum之allocator分配器,届时将对其内存管理器jemalloc和tcmalloc进行研究、学习,其中的jemalloc 为BSD的提供的内存分配管理而tcmalloc是google的内存分配管理模块。