亮网络解锁器,解锁网络数据的无限可能 了解详情
写点什么

FBString 分析与使用

  • 2019-11-24
  • 本文字数:1164 字

    阅读完需:约 4 分钟

FBString分析与使用

FBString 基本上用到了所有常见的实现 String 的方法,具有一定的学习和参考价值。但很多小伙伴都不了解 FBSting,希望通过本文能够帮助大家了解它、更好的运用它。

FBString 简介

fbstring is a drop-in replacement for std::string. The main benefit of fbstring is significantly increased performance on virtually all important primitives. This is achieved by using a three-tiered storage strategy and by cooperating with the memory allocator. In particular, fbstring is designed to detect use of jemalloc and cooperate with it to achieve significant improvements in speed and memory usage.


简单来说,使用了三层存储策略+内存分配策略+大小端支持,特别是配合使用 jemalloc, 减少磁盘碎片,加快并发下的分配速度和性能。

存储策略

SSO 技术

使用栈上缓冲区,存储字符不超过 23 个,存储在类的数组类型的成员变量中;

Eager Copy 技术

存储字符不超过 254 个,总是存储在 malloc 分配的堆上内存空间;

Copy-On-Write 技术

存储字符超过 254, 使用 COW 技术,引入引用计数,避免不必要的 copy 操作。

核心实现

1 fbstring_core

fbstring_core 是 FBString 的实现核心,提供了全部的操作接口,实现了三层存储策略+内存分配策略+大小端支持;


用户可根据需要实现自己的 fbstring_core_model(即 fbstring_core 的 mockup 接口定义)接口,即实现了自己的 String 类;


可以用状态机的思路来理解 fbstring_core, 按存储策略的不同其当前可能处于三种不同的状态:


small, medium, large, 当构造,赋值,扩容,收缩等操作发生时,会在这三种状态间转换,即其存储策略也会相应主调整,大部分函数都按这个思路来阅读吧;


category() 可获取当前的状态:small, medium, large,下面我们会经常提到这三种状态;


数据成员



使用了 union,其中 small_用于 small 状态时的字符串存储,MediumLarge 用于 medium 和 large 状态时的字符串存储;


使用 small_时,其最后一格存储 maxSmallSize - 当前字符串实现大小


这个看起来还是一目了然,很清楚的。


RefCounted



看着代码多,其实很简单。


在 large 状态使用 COW 技术就需要引用计数的存在,这个 RefCounted 就实现了这个,利用了 std::atomic 作计数,data_指向需要作计数的实体。fromData(Char p)*函数从需作计数的实体指针得到其对应的 RefCounted 实体的指针。

构造函数

基本上都是按三种状态对应的策略来构造


Move constructor


交换函数

void swap(fbstring_core & rhs)auto const t = ml_;ml_ = rhs.ml_;rhs.ml_ = t;
复制代码



相关文章:


http://en.cppreference.com/w/cpp/atomic/atomic


http://en.cppreference.com/w/cpp/language/move_constructor


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/8enQzKInxVfYA8oW51LcXg


2019-11-24 19:45591

评论

发布
暂无评论
发现更多内容

披荆斩棘成功上岸美团、字节、华为,分享Java面经及答案

程序知音

Java java面试 后端技术 Java面试八股文

模块四 -- 作业

李某人

架构训练营 #架构训练营

千万级学生管理系统试卷存储方案设计

π

架构实战营

华为开发者大会HDC2022:HMS Core 持续创新,与开发者共创美好数智生活

HMS Core

HMS Core

架构误区系列(Architecture Pitfall)

agnostic

构架师

数据库系统的组成

阿泽🧸

数据库 11月月更

【云原生】Nacos-TaskManager 任务管理的使用

石臻臻的杂货铺

云原生 nacos 11月月更

uniapp-如何在邀请页面生成海报

格斗家不爱在外太空沉思

vue.js uniapp 11月月更

使用TSDB自动检测时序数据的异常情况

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

小白入门:什么是CURD?

wljslmz

数据库 sql crud 11月月更

Java引用类型(class、interface)用法总结详解

共饮一杯无

Java 11月月更 Java引用类型

夜幕下的湖畔音乐派对,华为音乐之夜为HDC 2022划上“聚”号

最新动态

架构误区系列1:简单依靠扩容解决容量问题

agnostic

架构误区

设计千万级学生管理系统的考试试卷存储方案

小虎

架构训练营

零基础入门网络安全,收藏这篇不迷茫【2022最新】

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

如何在论文中画出漂亮的插图?

Jackpop

2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。

福大大架构师每日一题

算法 rust 福大大

第九期-模块五

wuli洋

为了面试字节,熬夜肝完这份Redis笔记后,我终于“硬”了一回

小小怪下士

Java redis 程序员 面试

漏洞扫描的种类

穿过生命散发芬芳

漏洞扫描 11月月更

极客时间架构训练营模块四作业

李晨

架构

HEM亮相华为HDC2022开发者大会,助力企业数字化办公

最新动态

Verilog语法入门

智趣匠

Verilog 11月月更 组合逻辑电路

Go语言入门14—Channel

良猿

Go golang 后端 11月月更

纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)

肥晨

11月月更 跳动的爱心 代码爱心 爱心代码

对象可达性状态流转分析、显式地影响软引用垃圾收集

共饮一杯无

Java 11月月更 引用类型扩展

【愚公系列】2022年11月 微信小程序-app.json配置属性

愚公搬代码

11月月更

设计模式之美-面向对象

GalaxyCreater

设计模式

架构实战营模块四

Geek_408c99

Github已经54k个star的Docker,到底是什么?

Jackpop

强引用、软引用、弱引用、幻象引用有什么区别和使用场景

共饮一杯无

Java 引用类型 11月月更

FBString分析与使用_文化 & 方法_刘伟_InfoQ精选文章