C ++中std :: string的底层结构是什么?
据我所知,有两个不同的概念:
1)整个字符串都通过char指针(char*
)实现。
2)字符串的某些部分是通过静态数组实现的。它的大小等于40,并且如果字符串的长度超过40,则会分配动态内存。
哪个是正确的?
答案 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
的编译器实现。