folly 之 fbstring

简介: # folly folly 是 facebook 开源的一个 c++ 基础库, 主打性能, 对 boost 或是 stl 的补充。 folly 是基于 c++11 的, 大量采用现代 c++ 的特性, 是学习现代 c++ 编程的一份很好 的素材。 # fbstring fbstring 是 std::string 的一个替代品, 它们的接口是完全兼容的。而且提供了

folly

folly 是 facebook 开源的一个 c++ 基础库, 主打性能, 对 boost 或是 stl 的补充。
folly 是基于 c++11 的, 大量采用现代 c++ 的特性, 是学习现代 c++ 编程的一份很好
的素材。

fbstring

fbstring 是 std::string 的一个替代品, 它们的接口是完全兼容的。而且提供了接口在
std::string 和 fbstring 间进行转换。fbstring 的最大卖点就是速度快。

fbstring 优化点

分层存储

fbstring 对于字符串的大小, 分成 3 种方式来分配和使用内存

  1. 小于 23(包括 23)

    直接放在 fbstring 内, 不额外分配内存, 对于大量使用小字符串的情景下, 这个优化
    是相当有用的, 字符串甚至可以直接在棧上, 非常的环保。
    
  2. 24 到 255(包括 255)

    直接采用 malloc 分配内存, 字符串拷贝也会直接拷贝
    
  3. 大于 255

    考虑到大字符串拷贝消耗比较大, 所以只有在需要的时候才会做真正的拷贝, 实现的方法
    是引用计数和 copy-on-write。
    

数据结构

struct MediumLarge {
  Char * data_;
  size_t size_;
  size_t capacity_;

union {
  uint8_t bytes_[sizeof(MediumLarge)]; // For accessing the last byte.
  Char small_[sizeof(MediumLarge) / sizeof(Char)];
  MediumLarge ml_;
};

联合结构中的 bytes_ 是为了获取最后一个字节用的,最后一个字节里存储了字符串的类型,
不同的类型会有不同的操作。对于 small 的字符串,它的总的大小是 24 字节,这其中包
含了字符串数据,包含一个字符串结束'\0',以及字符串的大小。但是 fbstring 可以存储
23 个字节(不包含字符串结束符),比 24 个字节只少了一个字节,我们来看看它是怎么
做到的。最后一个字节存储了字符串的类型,因为只有 3 种字符串类型,所以只需要 2 位
就够了,还剩下 6 位,这 6 位存储的不是字符串的长度,而是还有多少 可用剩余空间
,在字符串需要变大的时候,就可以直接用这个值来判断是否需要转换成 media 类型的字
符串,但是在取 size 的时候,需要简单计算一下,当 small 字符串长度小于 23 个字符
的时候,可以在字符串的末尾直接加上'\0',作为结束符。当字符内串达到 23 个字节的时
候,最后一个字节记录的 可用剩余空间 就变成了 0(最后一个字节的 6 位),又因为
small 类型的字符串的类型值正好是 0(最后一个字节的 2 位), 所以最后一个字节就是
0,这也正好充当了字符串的结束符。

find 优化

字符串的 find 操作使用了 Boyer Moore 算法来加速, 相对于 std::string 在查找命中
和非命中的情况下都有很大的提高,我随便找了两个字符串测试了一下,大概有 2-3 倍的提高

目录
相关文章
|
8月前
|
存储 Rust 安全
Rust中的线程基础:创建与管理
本文将深入探讨Rust中的线程基础,包括线程的创建、同步与通信机制,以及Rust提供的线程管理工具。通过理解这些概念,读者将能够更好地利用Rust的并发特性,编写高效且安全的多线程程序。
|
Shell Windows
windows出现错误0x800401E5:没有供标记使用的对象
windows出现错误0x800401E5:没有供标记使用的对象
windows出现错误0x800401E5:没有供标记使用的对象
|
存储 SQL 分布式计算
Velox表达式计算原理调研
velox是Meta开源的高性能的C++计算引擎,本文主要来调研下其表达式计算的实现原理。
907 3
|
5月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
271 0
|
7月前
Qt使用资源文件QtResource
Qt使用资源文件QtResource
179 5
|
7月前
|
机器学习/深度学习 自然语言处理 算法
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标
|
自然语言处理 Java 索引
Java中的Unicode字符编码与占用比特位解析
Java中的Unicode字符编码与占用比特位解析
|
存储 SQL 数据可视化
Ganos三维引擎系列(一):倾斜摄影数据管理与可视化功能解析
本文介绍了阿里云多模态时空数据库Ganos三维引擎在倾斜摄影数据管理中的应用。Ganos三维引擎支持三大类存储结构:表面网格模型、体网格模型与3D实景模型,其中表面网格模型用于存储带有语义的类BIM精细化三维模型,体网格模型用于存储地质体等非匀质“场”类三维模型,3D实景模型用于存储倾斜摄影、精白模等用于渲染的三维模型,三种存储结构都提供了原生数据类型、空间索引、分析算子、导入导出工具、可视化支撑等功能,为数字孪生类应用提供闭环的存算显能力,本文重点介绍基于3D实景模型开展倾斜摄影数据管理与可视化等功能。
|
存储 Ubuntu Linux
fd一个简单快速的find命令替代方案
目录 fd特点 如何在Linux中安装fd CentOS安装 命令选项 如何在Linux中使用fd
674 0
|
Linux C语言 C++
如何配置 Sublime Text4为 C++ 编辑器
自定义在Terminus的终端中编译运行cpp文件: 在Tools->Build System->New Build System中新建编译文件,保存为CppTerminus.sublime-build
489 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等