string类中的成员函数_Myptr()的作用

string类中的成员函数_Myptr()返回值是一个指向string类里实际用于存放字符串的内存区域的指针。


首先看看string和wstring类的定义:

[cpp] view plain copy
  1. typedef basic_string<char, char_traits<char>, allocator<char> > string;  
  2. 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类型:

[cpp] view plain copy
  1. enum  
  2. {   // length of internal buffer, [1, 16]  
  3.     _BUF_SIZE = 16 / sizeof (_Elem) < 1 ? 1: 16 / sizeof(_Elem)  
  4. };  
从这个定义可以得出,针对char和wchar_t它的值分别是16和8。

_Bxty是一个union:

[cpp] view plain copy
  1. union _Bxty  
  2. {   // storage for small buffer or pointer to larger one  
  3.     _Elem _Buf[_BUF_SIZE];  
  4.     _Elem *_Ptr;  
  5. } _Bx;  

为什么要那样定义_Bxty呢,看下面这段代码:

[cpp] view plaincopy
  1. _Elem * _Myptr()  
  2. {   // determine current pointer to buffer for mutable string  
  3.     return (_BUF_SIZE <= _Myres ? _Bx._Ptr : _Bx._Buf);  
  4. }  
这个函数返回basic_string内部的元素指针(c_str函数就是调用这个函数)。

所以当元素个数小于_BUF_SIZE时不用分配内存,直接使用_Buf数组,_Myptr返回_Buf。否则就要分配内存了,_Myptr返回_Ptr。

参考:

std::string实现原理1

C++ string实现原理2


你可能感兴趣的:(C++开发)