Fast and small C++
790.91 KB
17 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
文档详细阐述了C++中实现小字符串优化(Small String Optimization, SSO)的不同方法,包括FBString、libc++、libstdc++和MS STL的具体实现。文档展示了如何通过使用联合体(union)和标记位来区分小字符串和大字符串存储模式,并说明了如何在小字符串容量范围内存储字符串以避免动态内存分配。此外,文档还介绍了压缩对(CompressedPair)在优化内存使用方面的应用。 | ||
AI总结 | ||
《Fast and small C++》文档内容总结:
---
### 1. 实现小字符串优化 (Small String Optimization, SSO)
文档详细介绍了几种不同标准库实现SSO的方法,重点包括:
#### (1) **fbstring 实现**
- 使用 `union` 存储短字符串和长字符串:
- 短字符串模式 (`sso`): 数据存储在 `char` 数组中,最后一个字节用于模式标记。
- 长字符串模式 (`normal`): 存储指针、大小和容量。
- 关键函数:
- `is_long()`: 判断是否为长字符串,通过模式标记的最高两位检查。
- `size()`: 返回字符串长度,短模式下从容量中减去模式字节。
- `capacity()`: 返回容量,短模式下固定为 `sso_cap()`。
#### (2) **libc++ 实现**
- `union` 结构类似,但采用位标记:
- `sso` 模式:使用 `size_t` 的 highest bit 表示长字符串标记。
- `normal` 模式:存储容量、大小和指针。
- 关键函数:
- `is_long()`: 直接通过标记位判断。
- `size()`: 直接从 `size` 字段获取。
#### (3) **libstdc++ 实现**
- 使用 `mPtr` 和 `mBuf` 判断字符串模式:
- `mPtr` 表示指针,`mBuf` 表示短字符串缓冲区。
- `mSize` 和 `mCapacity` 共享内存空间。
- 关键函数:
- `is_long()`: 通过 `mPtr` 是否等于 `mBuf` 判断。
- `capacity()`: 短模式下固定为 `sso_cap()`。
#### (4) **MS STL 实现**
- 类似 libstdc++,使用 `mCapacity` 判断长短模式:
- `mCapacity` 超过 `sso_cap()` 表示长字符串。
- `mPtr` 存储指针,`mBuf` 存储短字符串。
- 关键函数:
- `is_long()`: 通过 `mCapacity` 判断。
- `capacity()`: 直接返回 `mCapacity`。
---
### 2. 压缩对 (Compressed Pair)
文档介绍了通过模板实现的压缩对技术,用于减少内存占用:
- 使用 `[[no_unique_address]]` 属性优化内存布局。
- 示例包括 `unique_ptr` 删除器的压缩实现,减少对象大小。
- 代码示例:
```cpp
template |
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
5 页请下载阅读 -
文档评分