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

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

时间: 2024-08-28 04:05:07

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

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

上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池:此外在windows下使用可使用其自带的内存分配方式:具体的第三方库可以参阅:http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml:目前我们主要的精力尽可能在Chromium浏览器中base公共通用库的主要内容上,所以不再详

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

本节将介绍base公共通用库中的containers,其包含堆栈.列表.集合.以及Most Recently Used cache(最近使用缓存模板). linked_list.h:一个简单的列表类型,通过模板实现,内部采用双链表的形式,有区别于c++标准模板库的std::list<T*>,它的使用方式为:base::LinkedList<T>; 相对std::list<T*>,其优点有: 1. 删除一个元素,操作复杂度为O(1),而std::list<T*>

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

本文将介绍debug调试相关的内容,包括调试器.性能分析.堆跟踪.跟踪事件等: alias.h:Alias函数,提供防止载微软的编译器优化某参数变量的操作,内部通过#pragma optimize("", off)与#pragma optimize("", on)来实现关闭所有的优化选项,再恢复它们到原始(或默认)的设定:事实上Alias内部未实现任何的操作. debugger.h: 1. SpawnDebuggerOnProcess:提供开始注册系统级的JIT即时

[tomcat7源码学习]初始化之catalina.home和catalina.base(转)

我们在代码中为了获取某个配置文件路径下的文件经常会这么写 String tomcatPath = System.getProperty("catalina.home") + "/webapps/axis2/WEB-INF/conf/"; tomcatPath = tomcatPath.replace("/", File.separator); //使用此方法是为了区分unix系统与windows, //File.separator UNIX中为/

【 js 基础 】【 源码学习 】源码设计 (持续更新)

学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:underscore 设计分析 第一部分: zepto 设计分析zepto 是一个轻量级的 Javascript 库.相对于 jquery 来说在 size 上更加小,主要是定位于移动设备.它是非常好的学习源码的入门级 javascript 库.这里重点说一下,这个库的设计,而对于详细的源码学习大家可以 star

jQuery源码学习感想

还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码,那时我不明白他们为何要求那么高,现在才知道,原来没那么高,他问的都是jQuery最基本的框架架构,不过对于不知道的来说,再简单我也是不知道,那时写了一篇博文去吐槽了一下,那时候也是我自己真正激发自己的时候,那时候我说我一定要搞好自己的jQuery基础,没想到那么快就实现了,一个月的源码学习时间就结束

nginx源码学习资源

http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html 2012-06-13 21:32 by 轩脉刃, 26499 阅读, 5 评论, 收藏, 编辑 nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没有注释,完全没有配置文档的代码. 现在你最希望要的是一份注释版的nginx源码,

commons-fileupload源码学习心得

commons-fileupload依赖于commons-io包. commons-fileupload的使用方法: 1.创建一个文件项目工厂类DiskFileItemFactory.       DiskFileItemFactory有俩个构造方法: 1 DiskFileItemFactory() 其中sizeThreshold是默认值10kB, 文件大小不超过这个值将内容保存在内存,超过这个值会把文件保存到临时目录下,可用System.getProperty("java.io.tmpdir&

caffe源码学习之Proto数据格式【1】

前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下C++,同时也梳理一下自己之前的理解. 正文: 我们先不看caffe的框架结构,先介绍一下caffe.proto,是google开源的一种数据交互格式--Google Protobuf,这种数据的格式,我们可以看到caffe.proto中内容: syntax = "proto2"; pac