c – std :: string分配策略

我对一些基本的字符串实现有点困惑.我一直在寻找内心的工作和学习新事物.我无法完全掌握如何管理内存.

只是来自基本字符串实现的一些花絮

>原始分配器用于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  |
上一篇:CF1538D Another Problem About Dividing Numbers题解


下一篇:AtCoder Beginner Contest 159 E - Dividing Chocolate【枚举】