string的写时拷贝分析

在本机器上调用sizeof(string)的时候,答案为4

于是好奇之

typedef basic_string string;

 

 

 

 *  A string looks like this:

   *

   *  @code

   *                                        [_Rep]

   *                                        _M_length

   *   [basic_string<char_type>]            _M_capacity

   *   _M_dataplus                          _M_refcount

   *   _M_p ---------------->               unnamed array of char_type

   *  @endcode

   *

 

只有一个成员变量:

 

     mutable _Alloc_hider _M_dataplus;

让我们看看这个成员变量
struct _Alloc_hider : _Alloc
      {
_Alloc_hider(_CharT* __dat, const _Alloc& __a)
: _Alloc(__a), _M_p(__dat) { }
_CharT* _M_p; // The actual data.
      };
看出来它只有一个char *指针
那么string的length呢?
 size() const
      { return _M_rep()->_M_length; }
_M_rep() const
      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
_M_data() const
      { return  _M_dataplus._M_p; }
_M_data()返回的是char *指针的位置,也就是说假设string a="abc"
 *a.getData()是'a'
这样看来,在char *之前还有一段东西
base_string初始化的时候就预先分配了这个空间
 basic_string()
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
      : _M_dataplus(_S_empty_rep()._M_refdata(), _Alloc()) { }
static _Rep&
      _S_empty_rep()
      { return _Rep::_S_empty_rep(); }
 static _Rep&
        _S_empty_rep()
        { 
 // NB: Mild hack to avoid strict-aliasing warnings.  Note that
 // _S_empty_rep_storage is never modified and the punning should
 // be reasonably safe in this case.
 void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
 return *reinterpret_cast<_Rep*>(__p);
}
template<typename _CharT, typename _Traits, typename _Alloc>
    typename basic_string<_CharT, _Traits, _Alloc>::size_type
    basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
    (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /
      sizeof(size_type)];
_CharT*
_M_refdata() throw()
{ return reinterpret_cast<_CharT*>(this + 1); }

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值