string类中的成员函数_Myptr()返回值是一个指向string类里实际用于存放字符串的内存区域的指针。
首先看看string和wstring类的定义:
- typedef basic_string<char, char_traits<char>, allocator<char> > string;
- typedef basic_string<wchar_t, char_traits<wchar_t> allocator<wchar_t> > wstring;
从这个定义可以看出string和wstring分别是模板类basic_string对char和wchar_t的特化。
再看看basic_string类的数据成员:
_Mysize表示实际的元素个数,初始值为0;
_Myres表示当前可以存储的最大元素个数(超过这个大小就要重新分配内存),初始值是_BUF_SIZE-1;
_BUF_SIZE是一个enum类型:
- enum
- { // length of internal buffer, [1, 16]
- _BUF_SIZE = 16 / sizeof (_Elem) < 1 ? 1: 16 / sizeof(_Elem)
- };
_Bxty是一个union:
- union _Bxty
- { // storage for small buffer or pointer to larger one
- _Elem _Buf[_BUF_SIZE];
- _Elem *_Ptr;
- } _Bx;
为什么要那样定义_Bxty呢,看下面这段代码:
- _Elem * _Myptr()
- { // determine current pointer to buffer for mutable string
- return (_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);
- }
所以当元素个数小于_BUF_SIZE时不用分配内存,直接使用_Buf数组,_Myptr返回_Buf。否则就要分配内存了,_Myptr返回_Ptr。
参考: