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. RSA加密例子和中途遇到的问题

    在进行RSA加密例子 package test; import java.io.IOException; import java.security.Key; import java.security. ...

  2. js访问php,返回数组时的注意事项

    用ajax访问php脚本返回值是数组的时候,php端需要使用json_encode()函数进行转码成json字符串,js端需要用JSON.parse()来吧json字符串转换成数组或对象. 直接返回会 ...

  3. window 使用vagrant搭建开发开发环境

    # -*- mode: ruby -*-# vi: set ft=ruby : # All Vagrant configuration is done below. The "2" ...

  4. 搭建Apache Web服务器

    1.下载Apache服务器的安装包 地址:http://httpd.apache.org/download.cgi 从http://archive.apache.org/dist/httpd/bina ...

  5. iis虚拟目录实现分布式文件服务器

    前提:假定有2台服务器:服务器a和服务器b,则服务器a和b须在同一局域网内 服务器设定:a为web服务器,b为文件服务器.这里服务器环境是:Windows Server 2008 R2 大致步骤如下: ...

  6. PHP之compact()函数

    PHP之compact()函数 compact()函数将变量转化为数组: <?php //直接调用函数 $a=1;$b=3;$c=4; var_dump($a,$b,$c); //自定义函数实现 ...

  7. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  8. linux几个常用的命令及获取帮助的方法

    date:时间管理,可以显示.修改系统时间.  设定时间:格式:MMDDhhmm[[cc]yy][.ss]其中MM为月分,DD为日期,hh为小时,mm为分钟,CC为年的前两位 YY为年分的后两位,.s ...

  9. PX 和PT的区别

    字体大小的设置单位,常用的有2种:px.pt.这两个有什么区别呢? 先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英 ...

  10. touch事件中的touches、targetTouches和changedTouches详解

    touches: 当前屏幕上所有触摸点的列表; targetTouches: 当前对象上所有触摸点的列表; changedTouches: 涉及当前(引发)事件的触摸点的列表 通过一个例子来区分一下触 ...