我对一些基本的字符串实现有点困惑。我一直在通过消息来源了解内心的工作并学习新事物。我不能完全掌握内存如何管理。std :: string分配策略
从基本字符串实现
原始分配器只是一些小花絮是char类型
typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
...然后在分配代表被放置在分配的缓冲区
__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类型)
此外,为什么(或更确切地说) ES调用_M_refdata
知道在字符数据的开始(或结束)是在缓冲器内(即this+1
)
编辑:不只是this+1
内部指针推到下一个位置的_Rep
对象之后?
我对内存对齐和铸造有基本的了解,但这似乎超出了我已阅读的任何内容。
任何人都可以帮忙,或者指点我更多内容丰富的阅读材料吗?
这与'char'无关。你可以'将所有简单的指针类型'reinterpret_cast'对齐。 – filmor 2012-01-10 20:54:45
@filmor:不正确。这违反了严格的别名规则。 – 2012-01-10 20:56:48
@filmor:这个语言会让你做到这一点,但它并不保证将它编译成你认为它应该做的事情。例如,在将'char *'转换为'double'后,它可能会将double加载到寄存器中。然后你写一些东西给char *'。它*不会*改变'double'的值。 – 2012-01-10 20:59:41