http://www.forfreezone.com

头文件体系

析类型

此地有多少个类型定义特别首要:value_type, pointer, size_type。 从源代码上看,那一个项目经过了生机勃勃层又后生可畏层的typedef,源头难辨。 因而,大家转而从规范草案来先解读value_type

typedef typename traits::char_type      value_type;

X::char_type    ->      charT
charT           ->      char

任何七个种类也依理深入分析,最终得出它们的实在类型分别为:

图片 1

看继承

看得出,basic_string的接轨种类特别复杂(近年来毫不相关部分本身用...代替了)。

1. typedef basic_string<char, char_traits<char>, allocator<char> >
    string;
                ↓↓↓
2. class basic_string
    : public _String_alloc<!is_empty<_Alloc>::value,
        _String_base_types<_Elem, _Alloc> > {...}
                ↓↓↓
3. class _String_alloc
    : public _String_val<typename _Alloc_types::_Val_types> {...}
                ↓↓↓
4. class _String_val
    : public _Container_base {...}
                ↓↓↓
5. typedef _Container_base12 _Container_base;
                ↓↓↓
6. struct _Container_base12 {...}

看成员

光有世襲连串还远远不够,大家还得看看类成员。 注意,这里没有必要关注模版参数,至于缘何,你们本身非凡思量喽 >-<)

图片 2

测大小

此地我们相比较4种版本的basic_string模版类,分别是:string, wstring, u16string, u32string. 固然她们是不一致的字符串类型,不过其sizeof的结果却一样,都为40字节(x64下):

图片 3

看源码

大家都知晓,上面4个不等的连串是相近份模版(basic_string)的实例化,因而它们的内部存款和储蓄器模型都以千篇大器晚成律的。 这里大家来追踪一下string类型的源代码,源码援用VS二〇一一版的正规string库。

得结果

综上,字符串类型内部存款和储蓄器模型如下:

图片 4

谈起底让大家拿string类型来讲雅培(Nutrilon卡塔尔下(><良心保障,下图为代码运转结果,非纯数字打字与印刷):

图片 5

看定义

可以看出,_Container_base12类只含有叁个指南针(指向五个代理类,这里大家不深究),大小恒久为1个字长。 由此,大家任重先生而道远来拜谒_String_val类的积极分子定义:

1. enum
     {  // length of internal buffer, [1, 16]
      _BUF_SIZE = 16 / sizeof (value_type) < 1 ? 1
         : 16 / sizeof (value_type)};

  union _Bxty
    {   // storage for small buffer or pointer to larger one
    value_type _Buf[_BUF_SIZE];
    pointer _Ptr;
    char _Alias[_BUF_SIZE]; // to permit aliasing
    } _Bx;

2. size_type _Mysize;   // current length of string
3. size_type _Myres;    // current storage reserved for string

其中,_BUF_SIZE概念了缓冲区的尺寸:

  • 若value_type类型小于1字节,则 **_BUF_SIZE = 16**。
  • 否则,**_BUF_SIZE = 16 / sizeof(value_type)**。(用心,这里是整除取商!!!)

郑重声明:本文版权归澳门新葡8455最新网站所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。