C ++中std :: string的底层结构是什么?
据我所知,有两个不同的概念:
1)整个字符串用char指针(char*
)实现。
2)字符串的某些部分使用静态数组实现。它的大小等于40,如果字符串的长度超过40,则分配动态内存。
哪一个是正确的?
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
字符。
我很确定没有实现使用静态数组,因为如果分配了两个字符串,那将无效。
使用固定大小的数组来改进内存处理称为短字符串优化,但c ++标准只指定了接口而不是实现,所以它可能会有所不同。
你能做的最好的事情是看看std::string
的编译器实现。