我对一些基本的字符串实现有点困惑。我一直在通过源代码了解内部工作并学习新事物。我无法完全掌握内存是如何管理的。
只是一些基本字符串实现的花絮
原始分配器用于 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
知道字符数据的开始(或结束)在缓冲区内的位置(即this+1
)
编辑:是否this+1
只是将内部指针推到_Rep
对象之后的下一个位置?
我对内存对齐和强制转换有基本的了解,但这似乎超出了我所读过的任何内容。
任何人都可以提供帮助,或者向我指出更多信息丰富的阅读材料吗?