Swift 里字符串(三)small String

small string, 只有两个 UInt64
的字,这里面存储了所有的信息。
内存布局如下:

第二个 UInt64
存储了标记位和长度信息,以及部分字符串的值
// Get an integer equivalent to the _StringObject.discriminatedObjectRawBits
// computed property.
@inlinable @inline(__always)
internal var rawDiscriminatedObject: UInt64 {
// Reverse the bytes on big-endian systems.
return _storage.1.littleEndian
}
rawbit.1 | 值 | 含义 |
---|---|---|
b63 | 1 | 是不可变的 |
b62 | 0/1 | 是否是ASCII |
b61 | 1 | 是 small string |
b60 | 0 | 可以获取联系utf8 code point |
b59-b56 | 0000~1111 | 已经使用的长度 |
b55~b0 | 存储utf8 code point |
第一个UInt64
存储的都是字符串的值
初始化 small string
最基本的初始化
@inlinable @inline(__always)
internal init(leading: UInt64, trailing: UInt64, count: Int) {
_internalInvariant(count <= _SmallString.capacity)
let isASCII = (leading | trailing) & 0x8080_8080_8080_8080 == 0
let discriminator = _StringObject.Nibbles
.small(withCount: count, isASCII: isASCII)
.littleEndian // reversed byte order on big-endian platforms
_internalInvariant(trailing & discriminator == 0)
self.init(raw: (leading, trailing | discriminator))
_internalInvariant(self.count == count)
}
这是最基本的初始化方法。先根据是否是ASCII
和长度值,生成一个discriminator
。然后把discriminator
和trailing
结合,作为第二个UInt64
。
根据缓存区初始化
// Direct from UTF-8
@inlinable @inline(__always)
internal init?(_ input: UnsafeBufferPointer<UInt8>) {
if input.isEmpty {
self.init()
return
}
let count = input.count
guard count <= _SmallString.capacity else { return nil }
// TODO(SIMD): The below can be replaced with just be a masked unaligned
// vector load
let ptr = input.baseAddress._unsafelyUnwrappedUnchecked
let leading = _bytesToUInt64(ptr, Swift.min(input.count, 8))
let trailing = count > 8 ? _bytesToUInt64(ptr + 8, count &- 8) : 0
self.init(leading: leading, trailing: trailing, count: count)
}
即先判断长度是否超过上限,如果超过,返回nil
。
如果没有超过上限,再调用init(leading: UInt64, trailing: UInt64, count: Int)
方法。
small string 创建过程

Swift 里字符串(三)small String的更多相关文章
- Swift 里字符串(七)stringIndex
在 String 里,用来索引 Character 的,不是整数,而是StringIndex 内部结构 extension String { /// A position of a character ...
- Swift 里字符串(十)修改字符串
以append操作为例 public mutating func append(_ other: String) { if self.isEmpty && !_guts.hasNati ...
- Swift里字符串(五)Native strings
Native strings have tail-allocated storage, which begins at an offset of nativeBias from the storage ...
- Swift 里字符串(四)large sting
对于普通的字符串,对应的_StringObject 有两个存储属性: _countAndFlagsBits: UInt64 _object: Builtin.BridgeObject _countAn ...
- Swift 里字符串(一)概览
感受一下字符串相关的源文件个数  String 概览 是一个结构体 只有一个变量,类型是 _StringGuts  如上所示,String 真正的内容在__StringStorage或者__Sha ...
- [Swift]LeetCode394. 字符串解码 | Decode String
Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...
- Swift 里字符串(九)UTF16View
即以 UTF16 编码的格式来查看字符串. UTF16View 是一个结构体 @_fixed_layout public struct UTF16View { @usableFromInline in ...
- Swift里字符串(六)Shared strings
Shared strings do not have tail-allocated storage, but can provide access upon query to contiguous U ...
- Swift 里字符串(十一)OC 字符串和 Swift 字符串的转换
 to OC func _bridgeToObjectiveCImpl() -> AnyObject { if _guts.isSmall { return _guts.asSmall.wit ...
随机推荐
- springmvc 测试项目示例
新建一个 maven项目 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- smrtlink
SMRT Link is the web-based end-to-end workflow manager for the Sequel™ System. It includes software ...
- Metro Revealed: Building Windows 8 apps with XAML and C# 阅读笔记
第一章1.1.3中提到 Jesse Liberty 的<Pro Windows 8 Development with XAML and C#>,这是一本关于win8更全面的书,以后看.
- UVaLive 3645 Objective: Berlin (最大流)
题意:有n个城市,m条航班.已知每条航班的起点和终点,还有每条航班的载客量.出发时间.到达时间.并且要求在任何一个城市(起点.终点除外)都至少要有30分钟的中转时间,求起点到终点的最大客流量. 析:把 ...
- Tcl写法
#=============================================================== #Analysi&Synthesis execute_modu ...
- html5获取经纬度
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- UCMap移动GIS & 时空地图GIS
UCMapViewer是基于UCMap(OpenGL版)的通用地图开发框架,涵盖了各类GIS数据的展示.查询.编辑.分析等各项功能 (http://www.creable.cn/kuibu/xiaza ...
- oracl中的大数据类型clob
建表 create table test_name( test_id number(6) not null, img_data clob ); 在java中该表所对应的po为: class Tes ...
- NC入门笔记
简介: NC(全名NetCat),在网络界有"瑞士军刀"的美誉.它小巧而强悍,被设计成一个稳定的后门工具,能够直接由其它程序和脚本轻松驱动.同时,它也是一个功能强大的网络调试和探测 ...
- Citrus Engine简单Demo
Citrus Engine是一个的开源flash平台(platform,也可以说是卷轴类)游戏引擎,它基于Starling Framework添加了各种物理引擎,3D引擎,动画引擎. Citrus实现 ...