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

Gok*_*tug 2 c++ string

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

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

1)整个字符串用char指针(char*)实现.

2)字符串的某些部分使用静态数组实现.它的大小等于40,如果字符串的长度超过40,则分配动态内存.

哪一个是正确的?

Nat*_*ica 5

1)整个字符串用char指针(char*)实现.

这不是法律实施. size()并且capacity()必须是常量,因此您需要将该信息存储为指针或整数变量.

2)字符串的某些部分使用静态数组实现.它的大小等于40,如果字符串的长度超过40,则分配动态内存.

该数组不是静态成员,但这是合法的,因为C++ 11并称为小/短字符串优化.实现这一点的一种常见方法是

struct _internal
{
    char * start;
    char * end;
    char * cap;
};
union guts
{
    _internal ptrs;
    char arr[sizeof(_internal)];
}
Run Code Online (Sandbox Code Playgroud)

并且字符串将是一个包装器guts.这使得数组占用的空间不会超过指针版本,但允许您使用数组,直到您拥有多个sizeof(_internal) - 1字符.