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. logstash-5.0同步mysql

    环境 Windows10企业版X64 安装logstash-input-jdbc插件 进入logstash/bin/目录,命令: logstash-plugin install logstash-in ...

  2. js事件流

    event:事件对象,当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存在一个指定地方-event对象,供我们在需要调用.event对象必须是在一个事件调用的函数里 ...

  3. Html中自定义鼠标的形状

    Html中自定义鼠标的形状 <html> <head> <title>自定义的鼠标形状</title> <meta http-equiv=&quo ...

  4. 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)

    上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...

  5. android开发注意事项

    写到哪里算哪里,从新项目 说说我怎样开发 1.新建项目,创建自己的application 在Application中初始化xutils3和自己的UncaughtExceptionHandler,添加 ...

  6. HMM基本原理及其实现(隐马尔科夫模型)

    HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态 ...

  7. cross_domain

    要传参数的页面 引用cross_domain.js  这个是另外一个工程(m)的地址 <script type="text/javascript" src="htt ...

  8. php-fpm优化方法详解

    php-fpm优化方法 php-fpm存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是开始时开启一定数量的php-fpm进程,当请求量变大时,动态的增加php-f ...

  9. JS-时间函数

    /** * 日期范围工具类 */ var dateRangeUtil = (function () { /*** * 获得当前时间 */ this.getCurrentDate = function ...

  10. YII 错误 SQLSTATE[HY000] [2002] No such file or directory

    在使用yii的yii\db\Connnection时发生错误 <?php namespace app\controllers; use yii\web\Controller; use yii\d ...