🔗 StringNg
StringNg 是 Squid 对 String-buffer 的一种表示。
🔗 目标
本次实现工作的目标是增加 Squid 用于字符串操作的基本类型,特别是
🔗 内存管理
- 字符串应采用引用计数并自动清理。
- 低成本复制
- 低成本字符串切片(子字符串),以辅助分词。
- 良好的追加语义。
- 内存管理器(MemPools)友好性。
- 除了与外部库交互外,通常不需要离开内存管理环境的接口功能齐全。
🔗 架构概述
三个主要类完成了这项工作。
SBuf是公共接口,提供各种操作函数的访问。它旨在高效操作二进制缓冲区,并提供一些面向 ASCII 字符串的操作函数。MemBlob管理着引用计数的内存块(RefCountable 框架)。
SBuf 实例与 MemBlob 实例之间存在 N 对 1 的关系:一个 MemBlob 包含多个 SBuf 的数据,这些 SBuf 的数据可能部分或全部重叠。
SBuf 实现写时复制(copy-on-write)以防止别名副作用。提供了常用情况的快捷方式,例如向 SBuf 追加(当 MemBlob 末尾有未使用空间时,不进行 COW),或者当 SBuf 是 MemBlob 的唯一持有者时。
通过调整 MemBlob 的分配策略可以获得内存管理器的友好性。目前的做法是:使用启发式方法来定义分配多少额外空间。负担由 SBuf 和 MemBlob 分担:前者使用 SBuf 本地信息(例如,以复制操作次数表示的 SBuf 生命周期长度),而 MemBlob 处理更底层的优化。
🔗 优化
SBuf(和 StringNg)主要是不可变的。并非所有情况下都必须如此。例如,当 SBuf 拥有 MemBlob 时(即当 MemBlob 的引用计数为 1 时),可以允许更改字符串的部分内容。
🔗 线程安全
线程安全不在本范围内。
导航:站点搜索,站点页面,类别,🔼 向上