阅读目录

 
学习代码库的一般步骤

1) 编译安装;
2) 学习doc/manual文档;
3) 学习test用例;
4) 测试并使用。

folly库的学习心得

独立有用的小技巧

Eventfd.h ---- 针对eventfd系统调用的包装器。

Foreach.h ---- 伪语句(作为宏语句来实现),用于迭代。

IntrusiveList.h --- 方便类型定义,用于使用boost::intrusive_list(不知道干什么的)。

Likely.h ---- 针对__builtin_expect的包装器。分支预测编译加速。

Malloc.h ---- 内存分配助手,尤其是使用jemalloc时。

MapUtil.h ---- 用于查找联合容器的小工具,找不到返回默认值。(比如std::map和std::unordered_map)。

Preprocessor.h ---- 获取可变参数的第1个或第2个参数,用于模板编程!Synchronized.h的实现就靠这个!

ScopeGuard.h ---- Basically, it guarantees that a function is executed upon leaving the currrent scope unless otherwise told. 即确保资源能够被正确析构(调用资源析构函数)。

StlAllocator.h ---- STL分配器,包装简单的分配/取消分配接口。貌似为了低版本gcc。

Traits.h ---- 类型特性。用于判断类型是否可直接内存拷贝(可重定位的对象)。C++假定所有的对象都是“non-relocatable values”(需要调用构造函数而不能直接拷贝内存数据)。实际中,很多C++对象可通过直接拷贝内存数据完成对象"再造"!(Relocatable object/type -- 可重定位的对象/类型)。Traits.h的核心就是提供"可重定位的类型"编译时判断工具。FBvector的核心优化之一:利用memcpy/memmove来处理"可重定位的类型"!

C++功能增强和扩展

FBString.h ---- std::string性能优化版本。

FBvector.h ---- std::vector性能优化版本。

Bits.h ---- 各种位处理实用组件,针对速度而优化。

Conv.h ---- 各种数据转换例程(尤其是to和from字符串),针对速度和安全进行了优化。

DiscriminatedPtr.h ---- 类似boost::variant,但完全局限于指针。使用指针中最高位、未使用的16位作为鉴别器。所以sizeof(DiscriminatedPtr<int, string, Widget>) == sizeof(void*)。

Dynamic.h ---- 动态类型对象,类似boost::variant。用于json.h。

Format.h ---- Python式样的格式化实用组件。C++功能增强和扩展的集大成者,基本上用到了上述的各个头文件!

Range.h ---- 类Boost的随机访问数据包装类,针对StringPiece的定制版本。

String.h ---- 非常有用的string工具集合:std::string <=> FBstring 互转工具、C风格转义字符串工具(反转工具)、stringPrintf工具、prettyPrint(支持时间、容量等常见单位)、hexDump工具、errnoStr\exceptionStr、demangle(串化C++类型)、split(分拆字符串)。

Unicode.h ---- 定义了codePointToUtf8函数。实现unicode码点到utf-8编码的转换。

简化多线程编程

Arena.h,ThreadCachedArena.h ---- 内存分配的简单地方:多次内存分配同时被释放。使用线程版本。简化内存管理,相当于java的gc(垃圾回收机制)。

AtomicHashMap.h,AtomicHashArray.h ---- 高性能的原子哈希图,采用几乎无锁的操作。

ProducerConsumerQueue.h ---- 单生产者单消费者队列。

SmallLocks.h ---- 非常小的旋转锁(1字节和1位)。

Synchronized.h ---- 提供一种非常好的多线程同步编码范式!!!请直接看doc和测试代码!

ThreadLocal.h ---- 改进的线程本地存储,用于存储非内置类型。取代pthread_key_t。

ThreadCachedInt.h ---- 使用线程缓存的高性能原子增量。

独立组件

Hash.h ---- 各种流行的哈希函数实现。

GroupVarint.h ---- 针对32位值的Group Varint编码。

Histogram.h  ---- 用于收集直方图数据。

Json.h ---- JSON序列化器和反序列化器。使用dynamic.h。

Random.h ---- 只定义了一个函数:randomNumberSeed()。使用当前时间和PID来产生随机数种子。

TimeoutQueue.h ---- 定时器队列。按项目设定超时的队列。

就是为了性能

PackedSyncPtr.h ---- 一种高度专业化的数据结构,含有指针、1位旋转锁和15位整数,它们都在一个64位整型数中。目标:节约空间(当前64位机的指针高16位未用)。用到SmallLocks。

RWSpinLock.h ---- 快速而紧凑的读取器/写入器旋转锁。

small_vector.h ---- 含有小缓冲器方面的优化vector,策略可选:NoHeap、OneBitMutex。

sorted_vector_types.h ---- 类似std::map的集合体,但是作为排序向量来实现。适用:数量少。目的:节约空间。

总结

folly最大的不足就是需要C++11的新特性,需要gcc4.6以上的编译器方能使用。若是从学习的角度去看,folly有很多小技巧可学习;若从实用的角度看,folly能够极大地方便多线程编程;若从性能角度看,folly对不少C++功能做了增强和扩展。总之,folly是一个很不错的C++库。就冲着Andrei Alexandrescu的大名也看学习学习。不过从实际工作中看,就不要指望folly能够大大降低工作量了 ^_^。

参考

folly自带的doc和源码

揭秘Facebook官方底层C++函数Folly(docs/Overview.md翻译)

folly学习心得(转)的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  9. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. error c2129:静态函数已声明但未定义

    今天在做一个c函数暴露给lua 时,出现这个问题. 大概代码是这样的, 头文件: #ifndef LEVEL_DESIGNER_H #define LEVEL_DESIGNER_H extern &q ...

  2. 【Keras学习】常见问题与解答

    Keras FAQ:常见问题 如何引用Keras? 如果Keras对你的研究有帮助的话,请在你的文章中引用Keras.这里是一个使用BibTex的例子 @misc{chollet2015keras, ...

  3. topcoder WCNMLGB

    点开题->断开连接->再也上不去->我玩NM

  4. objc/runtime.h 相关

    Objecitve-C的重要特性是Runtime(运行时),在Interacting with the Runtime(交互运行)中,运行时函数部分,苹果给出了/usr/lib/libobjc.A.d ...

  5. PPP of DDD

    我是真够懒的了

  6. 每天一个linux命令(权限):【转载】 /etc/group文件详解

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...

  7. 《DSP using MATLAB》示例Example 8.12

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  8. {Reship}{Emgu}{vs2010}C#配置Emgu

    =============================================================================================This Ar ...

  9. c++ queue 用法

    最重要的是: queue 和 stack 都没有迭代器!!! 1. push 队列中由于是先进先出,push即在队尾插入一个元素. 2. pop 将队列中最靠前位置的元素拿掉,和push都是没有返回值 ...

  10. sql server2008升级

    安装了试用版的sql server2008,要升级为正式企业版.仅仅须要使用安装程序的 维护-升级 功能.在升级时输入企业版序列号,就能升级为正式版.以下给两个序列号 开发版: PTTFM-X467G ...