基本的な文字列の実装のいくつかと少し混乱しています。私は内部の働きを理解し、新しいことを学ぶためにソースを調べてきました. メモリがどのように管理されているか完全には把握できません。
基本的な文字列の実装からのちょっとしたヒント
生のアロケータは 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); }キャラクターの設定 - 1 種類の方法
_M_assign(__p->_M_refdata(), __n, __c);
私を悩ませているのは、生のアロケーターが char 型ですが、割り当てられたメモリが _Rep オブジェクトと文字データ (char 型である必要はありません) を保持している可能性があることです。
また、なぜ(またはどのように)_M_refdata文字データの開始(または終了)がバッファ内のどこにあるかを知るための呼び出しを行います(つまりthis+1)
編集:内部ポインタをオブジェクトthis+1の次の位置にプッシュするだけですか?_Rep
私はメモリの配置とキャストの基本的な理解を持っていますが、これは私が読んだものを超えているようです.
誰か助けてくれますか、またはより有益な読み物を教えてくれますか?