博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 里字符串(一)概览
阅读量:4505 次
发布时间:2019-06-08

本文共 2440 字,大约阅读时间需要 8 分钟。

感受一下字符串相关的源文件个数

String 概览

  • 是一个结构体
  • 只有一个变量,类型是 _StringGuts

 如上所示,String 真正的内容在__StringStorage或者__SharedStringStorage里面。

private static func create(    realCodeUnitCapacity: Int, countAndFlags: CountAndFlags  ) -> __StringStorage {    let storage = Builtin.allocWithTailElems_2(      __StringStorage.self,      realCodeUnitCapacity._builtinWordValue, UInt8.self,      1._builtinWordValue, Optional<_StringBreadcrumbs>.self)#if arch(i386) || arch(arm)    storage._realCapacity = realCodeUnitCapacity    storage._count = countAndFlags.count    storage._flags = countAndFlags.flags#else    storage._realCapacityAndFlags =      UInt64(truncatingIfNeeded: realCodeUnitCapacity)    storage._countAndFlags = countAndFlags#endif    storage._breadcrumbsAddress.initialize(to: nil)    storage.terminator.pointee = 0 // nul-terminated    // NOTE: We can't _invariantCheck() now, because code units have not been    // initialized. But, _StringGuts's initializer will.    return storage  }

这里是真正分配内存的地方。

标记位

String 里有若干标记位,表示不同类型,一共有4位,被称为 discriminator

On 64-bit platforms, the discriminator is the most significant 4 bits of the bridge object.

字符串粗略可以分为Small stringsLarge strings

几乎所有的字符串操作,都根据是否是Small string来做了区分,比如判断是否是ACSCII

//  // Whether the string is all ASCII  //  @inlinable  internal var isASCII: Bool {    @inline(__always) get {      if isSmall { return smallIsASCII }      return _countAndFlags.isASCII    }  }

_StringObject里获取并判断标记位

获取标记位

internal var discriminatedObjectRawBits: UInt64 {    return Builtin.reinterpretCast(_object)  }

即bridge object的最高位。

判断是否可变

@inlinable  internal var isImmortal: Bool {    @inline(__always) get {      return (discriminatedObjectRawBits & 0x8000_0000_0000_0000) != 0    }  }

判断是否是 small string

internal var isSmall: Bool {    @inline(__always) get {      return (discriminatedObjectRawBits & 0x2000_0000_0000_0000) != 0    }  }

判断是否提供了连续的UTF8 code point

// Whether this string can provide access to contiguous UTF-8 code units:  //   - Small strings can by spilling to the stack  //   - Large native strings can through an offset  //   - Shared strings can:  //     - Cocoa strings which respond to e.g. CFStringGetCStringPtr()  //     - Non-Cocoa shared strings  @inlinable  internal var providesFastUTF8: Bool {    @inline(__always) get {      return (discriminatedObjectRawBits & 0x1000_0000_0000_0000) == 0    }  }

转载于:https://www.cnblogs.com/huahuahu/p/Swift-li-zi-fu-chuan-yi-gai-lan.html

你可能感兴趣的文章
Pivotal tc Server Integration for Eclipse
查看>>
表单验证
查看>>
UIWebView 操作
查看>>
非阻赛IO模型
查看>>
Android应用程序签名详解(转载)
查看>>
CentOS7 Failed to start LSB: Bring up/down networking.解决方法
查看>>
360浏览器文档模式升级
查看>>
MongoDB学习笔记(四)
查看>>
bzoj2301 [HAOI2011]Problem b(莫比乌斯反演)
查看>>
C#文件操作-File类
查看>>
winform中Dock的布局规则
查看>>
Java实现主线程等待子线程
查看>>
命令模式(Command)
查看>>
CozyRSS开发记录9-快速实现一个RSS解析器
查看>>
后端程序员之路 21、一个cgi的c++封装
查看>>
ha_innobase::open
查看>>
IIS6架构
查看>>
ELKStack-生产案例项目实战(十一)
查看>>
PHP图形处理函数试题
查看>>
幸运数
查看>>