C ++中类字符串的内部结构

时间:2018-12-06 14:54:20

标签: c++ string

C ++中std :: string的底层结构是什么?

据我所知,有两个不同的概念:

1)整个字符串都通过char指针(char*)实现。

2)字符串的某些部分是通过静态数组实现的。它的大小等于40,并且如果字符串的长度超过40,则会分配动态内存。

哪个是正确的?

2 个答案:

答案 0 :(得分:5)

  

1)整个字符串都是通过char指针(char *)实现的。

这不是合法的实现。 size()capacity()必须是常量,因此您需要将该信息存储为指针或整数变量。

  

2)字符串的某些部分是通过静态数组实现的。它的大小等于40,并且如果字符串的长度超过40,则会分配动态内存。

该数组不是静态成员,但是从C ++ 11开始这是合法的,称为small/short string optimization。一种常见的实现方式是

struct _internal
{
    char * start;
    char * end;
    char * cap;
};
union guts
{
    _internal ptrs;
    char arr[sizeof(_internal)];
}

,该字符串将成为guts的包装。这样一来,数组占用的空间不会超过指针版本的空间,但允许您使用数组直到拥有超过sizeof(_internal) - 1个字符。

答案 1 :(得分:0)

我非常确定没有实现会使用静态数组,因为如果分配了两个字符串,这将无法正常工作。

使用固定大小的数组来改善内存处理称为短字符串优化,但是c ++标准仅指定接口而不指定实现,因此可能有所不同。

您能做的最好的就是看一下std::string的编译器实现。