libc ++中短字符串优化的机制是什么?
我想更详细地了解它在实践中是如何工作的,特别是在libc ++实现中:
为了符合SSO资格,字符串有多短?这取决于目标架构吗?
在访问字符串数据时,实现如何区分短字符串和长字符串?它m_size <= 16
是一个简单的,还是一个标志,是其他成员变量的一部分?(我想这m_size
或其中的一部分也可能用于存储字符串数据)。
我专门针对libc ++问了这个问题,因为我知道它使用SSO,甚至在libc ++主页上也提到过。
以下是查看来源后的一些观察结果:
libc ++可以使用两个稍微不同的字符串类内存布局进行编译,这由_LIBCPP_ALTERNATE_STRING_LAYOUT
标志控制。这两种布局还区分了little-endian和big-endian机器,这些机器总共留下了4种不同的变体。我将在下面的内容中假设“正常”布局和小端。
假设进一步size_type
是4个字节并且value_type
是1个字节,这就是字符串的前4个字节在内存中的样子:
// short string: (s)ize and 3 bytes of char (d)atasssssss0;dddddddd;dddddddd;dddddddd ^- is_long = 0// long string: (c)apacityccccccc1;cccccccc;cccccccc;cccccccc ^- is_long = 1
由于短字符串的大小在高7位,因此在访问它时需要移位:
size_type __get_short_size() const { return __r_.first().__s.__size_ >> 1;}
类似地,长字符串容量的getter和setter用于__long_mask
解决这个问题is_long
。
我仍在寻找我的第一个问题的答案,即__min_cap
短字符串的容量对不同的架构有什么价值?
冉冉说
相关分类