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的内存分配管理模块。

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

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

    上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池: ...

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

    本节将介绍base公共通用库中的containers,其包含堆栈.列表.集合.以及Most Recently Used cache(最近使用缓存模板). linked_list.h:一个简单的列表类型 ...

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

    本文将介绍debug调试相关的内容,包括调试器.性能分析.堆跟踪.跟踪事件等: alias.h:Alias函数,提供防止载微软的编译器优化某参数变量的操作,内部通过#pragma optimize(& ...

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

    我们在代码中为了获取某个配置文件路径下的文件经常会这么写 String tomcatPath = System.getProperty("catalina.home") + &qu ...

  5. Tomcat源码学习

    Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...

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

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...

  7. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  8. 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...

  9. 移动端触摸、点击事件优化(fastclick源码学习)

    移动端触摸.点击事件优化(fastclick源码学习) 最近在做一些微信移动端的页面,在此记录关于移动端触摸和点击事件的学习优化过程,主要内容围绕fastclick展开.fastclick githu ...

随机推荐

  1. CSS3 Animation 帧动画 steps()

    @keyframes fn{ 0%{} 100%{} } CSS3的Animation有八个属性 animation-name :动画名 fn animation-duration:时间 1s ani ...

  2. 几种常见的Shell

    Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说有多少种Shell,其实说的是Shell脚本解释器. bash bash是L ...

  3. js原生dom方法总结

    1.document document方法getElementById (Node)返回指定节点的引用getElementsByTagName (NodeList)返回文档中所有匹配元素的集合quer ...

  4. Android中使用ShareSDK集成分享功能

    引言      现在APP开发集成分享功能已经是非常普遍的需求了.其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的一些基本步骤和注意点,帮助朋友们避免一些坑.好了 ...

  5. C数组下标越界

    之前总听说C语言的各种毛病,今天算是遇到一个:数组下标越界 事情经过 两段完成不相干的代码,一段是测温度的,一段是测转速的.两段代码单独运行都没有问题,但是若运行测转速的代码,测温度的数据就会发生错误 ...

  6. 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux

    开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...

  7. Web 常用功能测试方法

    功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能.常用的测试方法如下: 1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确. 2. 相 ...

  8. python中不同包之间调用方法、

    在pycharm中... 当两个py文件在同一个文件夹下的时候.直接from 文件名 import *  即可 当两个文件在不同的文件夹下的时候.需要在文件中加入 _init_.py 文件.里面可以什 ...

  9. python2.7 学习笔记--列表的使用

    同其它编程语言一样,python也提供了丰富的数据结构,以方便数据的处理.本文介绍两种最基本的数据集合,列表和元组的使用. 一.列表使用介绍 可以理解为一个有序的序列.其使用方式举例如下: list= ...

  10. 解决svn问题:Wrong committed revision number: -1

    参考:http://my.oschina.net/luckyi/blog/291007