zoukankan      html  css  js  c++  java
  • 你读过的最好的 C++ 开源代码是什么?

    作者:编程指北
    链接:https://www.zhihu.com/question/21376384/answer/1925233838
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    必须是 Facebook Folly!这是facebook 开源的基于C++14的库,在facebook内部广泛使用。

    可以说是我看过最优雅的现代C++项目,里面一部分工具实现非常棒,比如hash map

    Folly的全称为Facebook Open-source Library,目的不是为了替代标准库,而是对标准库的一种补充,尤其是大规模下的性能。

    而且有很多C++标准库没有的工具,比如我之前写代码需要一个线程安全的hash map,但是C++标准库中没有线程安全的hash map。

    而 folly 中就有一个高性能的hash map,还有 string,对比 标准库有极大的性能提升。

    用Facebook自己的话来说就是:

    Good performance at large scale is a unifying theme in all of Folly.

    仓库地址:facebook/folly

    这真的是一个很好的现代C++项目!

    另外再推荐一个对于C++学习比较好的项目(不是现代C++哈): Google LevelDB ,这个项目不像 Chromium 那么巨大,属于一个人花点时间就能看懂的项目:

    Github地址:google/leveldb

    而且现在很多分布式存储都将 LevelDB 作为本地存储引擎,也是作为学习 LSM 这种经典的存储结构的优秀代码实现。

    它的特性Github主页已经说了:

    在这,顺便分享一份大学期间自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,去网上挨个找的,最后汇总而成。

    汇集了编程语言(Java、C++、C、Python等等)、操作系统、计算机网络、系统架构、设计模式、程序员数学、测试、中间件 、前端开发、后台开发、网络编程、Linux使用及内核、数据库、Redis....等主流的编程学习书籍。

    我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统

    书单:书单推荐,少即是多(含下载方式)

    网上看到一个写的不错的文章,可以看下 LevelDB 的架构:

    作者:linjinhe 链接: 来源:简书

    上图简单展示了 LevelDB 的整体架构。LevelDB 的静态结构主要由六个部分组成:

    1. MemTable:内存数据结构,具体实现是 SkipList。 接受用户的读写请求,新的数据修改会首先在这里写入。
    2. Immutable MemTable:当 MemTable 的大小达到设定的阈值时,会变成 Immutable MemTable,只接受读操作,不再接受写操作,后续由后台线程 Flush 到磁盘上。
    3. SST Files:Sorted String Table Files,磁盘数据存储文件。分为 Level0 到 LevelN 多层,每一层包含多个 SST 文件,文件内数据有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一层的数据由上一层进行 Compaction 得到。
    4. Manifest Files:Manifest 文件中记录 SST 文件在不同 Level 的分布,单个 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要维护多版本,因此可能同时存在多个 Manifest 文件。
    5. Current File:由于 Manifest 文件可能存在多个,Current 记录的是当前的 Manifest 文件名。
    6. Log Files (WAL):用于防止 MemTable 丢数据的日志文件。

    粗箭头表示写入数据的流动方向:

    1. 先写入 MemTable。
    2. MemTable 的大小达到设定阈值的时候,转换成 Immutable MemTable。
    3. Immutable Table 由后台线程异步 Flush 到磁盘上,成为 Level0 上的一个 sst 文件。
    4. 在某些条件下,会触发后台线程对 Level0 ~ LevelN 的文件进行 Compaction。

    读操作的流动方向和写操作类似:

    1. 读 MemTable,如果存在,返回。
    2. 读 Immutable MemTable,如果存在,返回。
    3. 按顺序读 Level0 ~ Leveln,如果存在,返回。
    4. 返回不存在。

    整体的代码量也不是特别巨大,大家完全可以去啃下来,对于提升 C++ 编码能力帮助极大!

    漫思
  • 相关阅读:
    redux dispatch、action、reduce 执行流程
    react中使用react-redux
    npm 全局安装默认地址
    react 组件外js文件路由跳转
    withRouter的作用和适用场景
    react 自定义高阶组件,实现路由拦截,子路由渲染
    移动端原生js使用touch事件监听滑动方向
    Vue.js中this.$nextTick()的使用与理解
    域名等级划分介绍
    nodejs 实现一个账号只能一台设备登录
  • 原文地址:https://www.cnblogs.com/sexintercourse/p/14978838.html
Copyright © 2011-2022 走看看