C ++中类字符串的内部结构[关闭]

问题描述 投票:2回答:2

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

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

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

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

哪一个是正确的?

c++ string
2个回答
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字符。


0
投票

我很确定没有实现使用静态数组,因为如果分配了两个字符串,那将无效。

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

你能做的最好的事情是看看std::string的编译器实现。

© www.soinside.com 2019 - 2024. All rights reserved.