C++的一些优秀的开源框架
总结一些c++的优秀的开源框架
作者:BUG君
链接:https://www.zhihu.com/question/20201738/answer/2534164273
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
必须是 Facebook Folly!这是facebook 开源的基于C++14的库,在facebook内部广泛使用
很多 C++ 项目都不错,但是不适合全部阅读,比如 Chromium ,源码总计 2000w+行,可以说没有任何人能够完全掌握,就算是1/100难度也不小,我看有不少博主在鼓吹看了 Chromium,这种除了是内核开发者,其它人说大概率是误导初学者。
我推荐一种阅读源码的方式,就是看一些基础库,Chromium base、net、ipc、core几个模块,不要去看大量需要背景知识的模块,因为我们是用来学习 C++的,最好是看一些通用的模块。
比如 Facebook folly 里面就有非常多对标准库的补充,学习这种通用标准库才对 C++ 有快速提升!
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....等主流的编程学习书籍。我把它放在693186131群内,方便获取.也方便交流编程类
我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统:展示下一些内容
可以看下 LevelDB 的架构:
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++ 编码能力帮助极大!
这个编程交流群再推荐一下:693186131欢迎大家
发布于 2022-06-18 14:14・IP 属地湖南
赞同 31添加评论
分享
收藏喜欢收起
更多回答
关注
182 人赞同了该回答
- Webbench
Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。
下载链接:GitHub - EZLippi/WebBench
- Tinyhttpd
tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。
下载链接:GitHub - EZLippi/Tinyhttpd
- cJSON
cJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。
cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。
- CMockery
cmockery是google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery的源代码行数不到3K,你阅读一下will_return和mock的源代码就一目了然了。
主要特点:
- 免费且开源,google提供技术支持;
- 轻量级的框架,使测试更加快速简单;
- 避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好;
- 并不强制要求待测代码必须依赖C99标准,这一特性对许多嵌入式系统的开发很有用
- Libev
libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。
下载链接:http://software.schmorp.de/pkg/libev.html
- Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7的代码量还是可以接受的,只有10K行左右。
下载地址:memcached - a distributed memory object caching system
- Lua
Lua很棒,Lua是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。
让我脸红的是Lua的源代码,百分之一百的ANSI C,一点都不掺杂。在任何支持ANSI C编译器的平台上都可以轻松编译通过。我试过,真是一点废话都没有。Lua的代码数量足够小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。
下载地址:The Programming Language Lua
- SQLite
SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致3万行C代码,250K。
下载地址:SQLite Home Page 。
- redis
redis是高性能键值对存储系统,支持数据持久化,能将操作纪录保存在硬盘中,支持更多的数据类型,与memcached相比更接近数据库的角色。
- LevelDb:Google的键/值对(Key/Value Pair)嵌入式数据库google/leveldb · GitHub
- SGI STL的源码Download STL source code
- Boost.Asio - 1.58.0
- 高性能web服务器nginx: download
这个网站整理的比较全,可以看看值得推荐的C/C++框架和库
更多推荐
所有评论(0)