我对一些基本的字符串实现有点困惑.我一直在寻找内心的工作和学习新事物.我无法完全掌握如何管理内存.
只是来自基本字符串实现的一些花絮
>原始分配器用于char类型
typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
> …然后当分配Rep放在分配的缓冲区内时__size被计算为也适合字符
size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
_Rep *__p = new (__place) _Rep;
>这是从_Rep缓冲区中提取字符数据的方式
_CharT* _M_refdata() throw()
{
return reinterpret_cast<_CharT*>(this + 1);
}
>设置角色 – 适用于某种方式
_M_assign(__p->_M_refdata(), __n, __c);
困扰我的是原始分配器是char类型,但分配的内存可能包含_Rep对象,加上字符数据(不必是char类型)
另外,为什么(或者更确切地说)对_M_refdata的调用知道字符数据的开始(或结束)在缓冲区内的位置(即这个1)
编辑:这只是将内部指针推到_Rep对象后面的下一个位置吗?
我对内存对齐和转换有基本的了解,但这似乎超出了我所读过的内容.
任何人都可以帮忙,或者给我指出更多信息丰富的阅读材料?
解决方法:
您错过了新的展示位置.这条线
_Rep *__p = new (__place) _Rep;
在__place初始化一个新的_Rep-object.之前已经分配了这个空间(意味着一个placement-new本身不分配,它实际上只是一个构造函数调用).
C和C中的指针算术告诉你,这个1是一个指向sizeof(* this)字节的指针.由于之前已经分配了(__capacity 1)* sizeof(_CharT)sizeof(_Rep)字节,因此_Rep对象之后的空格用于字符数据.因此布局如下:
| _Rep | (__capacity + 1) * _CharT |