女主宣言

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

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

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

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

FBString分析与使用相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. 2022-2028年中国自动驾驶系统行业现状调研分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国自动驾驶系统行业市场行业相关概述.中国自 ...

  3. 2022-2028年中国阻尼涂料市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻尼涂料行业市场行业相关概述.中国阻尼涂 ...

  4. 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻燃装饰行业市场行业相关概述.中国阻燃装 ...

  5. 2022-2028年全球与中国漂白吸水棉市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国漂白吸水棉行业市场行业相关概述.全 ...

  6. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国青苔清洗剂行业市场行业相关概述.全 ...

  7. 2022-2028年全球与中国氢碘化物市场智研瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国氢碘化物行业市场行业相关概述.全球 ...

  8. 2022-2028年全球与中国人字拖市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国人字拖行业市场行业相关概述.全球与 ...

  9. 2022-2028年全球与中国乳胶丝市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国乳胶丝行业市场行业相关概述.全球与 ...

最新文章

  1. 算法课题(一) 贪心算法
  2. (提示)ubuntu16.04通过sealos安装k8s,需要重新部署apply一下calico组件
  3. 看了这一篇,就不用看别的——Java中Object关于锁的的三个方法:wait,notify,notifyAll的作用
  4. Flask Web 开发 错误页面自定义
  5. mysql:修改root初始化密码
  6. 如何使能linux vivid
  7. spring之集合注入
  8. 【java】instanceof 性能
  9. Linux学习笔记014---文件及文件夹权限设置_以及文件、文件夹的删除_移动_复制操作
  10. IntelliJ IDEA 2018 设置代码提示对大小写不敏感
  11. php----显示中文乱码的问题
  12. 老外写的比较好用的splitter控件
  13. bz格式linux解压,Linux下tar bz gz等压缩包的压缩和解压
  14. 数学建模时序数据分析——趋势性检验和平稳性检验
  15. SQL2008 SQLExpress数据库存满处理
  16. Python让AI虚拟主播接入微软Azure语音合成并精准嘴型同步
  17. HTML5期末大作业:海美食网站设计——上海美食(8页) 酒水网页设计作业,甜品美食网页制作作业, 学生零食网页作业
  18. (附源码)计算机毕业设计SSM基于java学科竞赛管理系统
  19. Winserver2016安装Exchange2016总结(一堆坑)
  20. 操作系统春招面试复习之:操作系统概述

热门文章

  1. 消除ie上的:为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件...
  2. 也拿baidu搜索开玩笑!
  3. django之Layui界面点击弹出个对话框并请求逻辑生成分页的动态表格
  4. 十分钟轻松搞懂CSS的五大定位方式!(建议收藏)
  5. 计算机专业能用ipad吗,iPad 能不能代替电脑?说说我这 3 个月的使用体验
  6. zanli_android_1.1.0,【轻松集赞】写了个涉嫌混淆微信官方服务的小程序
  7. 体系结构方案 -ETL 中间件
  8. JavaScript:函数
  9. Java面试中常问的Spring方面问题(涵七大方向共55道题,含答案)
  10. C# 使用NPlot绘图