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