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

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


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

  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类型:

  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:

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

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

  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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值