NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:45586

评论

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

天翼云以领先云网算力,为工业信息化筑牢算力底座

Geek_2d6073

Mac电脑音频修复和增强推荐 iZotope RX 10最新激活版

胖墩儿不胖y

Mac软件 音频修复 音频增强软件

软件测试|第二届、第三届<火焰杯>软件测试开发选拔赛河北赛区颁奖典礼落幕

霍格沃兹测试开发学社

Perforce发布《2023游戏开发与设计现状报告》,洞察游戏行业的改变与2023年最令人兴奋的行业动向

龙智—DevSecOps解决方案

游戏开发

ARB链(Arbitrum)ARBT代币合约质押挖矿系统开发(源码技术搭建)

l8l259l3365

2024深圳电子展

AIOTE智博会

电子展 深圳电子展 电子信息展 深圳电子信息展

四川华新学院在“火焰杯”软件测试高校就业选拔赛取得佳绩

测试人

软件测试

面对“双十一”这样的大促,品牌方还能多做些什么?

博文视点Broadview

后 Cookie 时代如何实现精准的用户运营与管理?

Authing

低代码 Idaas 用户管理 Authing 用户运营

文心一言 VS 讯飞星火 VS chatgpt (119)-- 算法导论10.3 4题

福大大架构师每日一题

福大大架构师每日一题

合约开发 - DAPP开发 - swap开发

西安链酷科技

swap链游 合约交易所开发 dapp开发 NFT开发

美国站群服务器配置指南,帮你轻松管理多个网站

一只扑棱蛾子

站群服务器 美国服务器 美国站群服务器

【CIKM 2023】扩散模型加速采样算法OLSS,大幅提升模型推理速度

阿里云大数据AI技术

算法

Mac电脑屏幕录像 Iris最新直装激活版

mac大玩家j

录屏软件 Mac软件 Mac好用的屏幕录制软件

FC红白机游戏600合集 for mac

展初云

Mac 游戏 FC 红白机游戏

OpenHarmony Meetup成都站招募令

OpenHarmony开发者

OpenHarmony

一次单据图片处理的优化实践 | 京东物流技术团队

京东科技开发者

性能优化 图片处理 pdfbox 企业号10月PK榜

飞码LowCode前端技术系列(一):数据结构设计 | 京东云技术团队

京东科技开发者

低代码 营销 企业号10月PK榜 web页面搭建

IDEA工具第二篇:自定义Java方法注释模板 | 京东云技术团队

京东科技开发者

Java IDEA 参数 注释 企业号10月PK榜

仅需2分钟 让智慧助手小艺用你的声音时刻陪伴老人

最新动态

自定义MyBatis拦截器更改表名

emanjusaka

Java mybatis

中国大模型开源创新与合作的新篇章 | 2023 CCF中国开源大会

OpenI启智社区

开源 大模型 OpenI启智社区 CCF中国开源大会 鹏城·脑海大模型

浅谈RabbitMQ的延迟队列

高端章鱼哥

RabbitMQ 延迟队列

第5期 | GPTSecurity周报

云起无垠

LLM 新缺陷曝光,自我纠正成功率仅 1%;苹果超 95% 产品仍在中国制造丨 RTE 开发者日报 Vol.72

声网

深度学习应用开发示例之“定位编码”

矩视智能

深度学习 机器视觉

NFTScan | 10.16~10.22 NFT 市场热点汇总

NFT Research

NFT NFTScan nft工具

测吧(北京)科技有限公司项目总监王雪冬一行访问计算机学院探讨合作

霍格沃兹测试开发学社

手把手|支付宝异步通知如何使用

盐焗代码虾

安全 支付宝 异步通知

行云管家祝各位程序员节日快乐!

行云管家

程序员 程序员节

2023年行云绽放&傲冠股份厨艺比拼团建活动圆满结束

行云管家

行云 团建 傲冠

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