代码之家  ›  专栏  ›  技术社区  ›  Goktug

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

  •  2
  • Goktug  · 技术社区  · 7 年前

    STD::C++中的字符串的底层结构是什么?

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

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

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

    哪一个是正确的?

    2 回复  |  直到 7 年前
        1
  •  5
  •   NathanOliver    7 年前

    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 字符。

        2
  •  0
  •   vlad_tepesch    7 年前

    我非常确定,如果分配了两个字符串,则没有任何实现使用静态数组,因为这将不起作用。

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

    您所能做的最好的是,看看编译器的实现 std::string .