私は基本的な文字列の実装のいくつかと少し混乱しています。私は内側の作業を理解し、新しいことを学ぶためにソースを調べてきました。私はメモリがどのように管理されているかを完全に把握することはできません。std :: string allocation policy
基本文字列実装
からわずかいくつかの一口生アロケータは、割り当てられたバッファ
__size
内担当者が置かれ割り当てるときに算出され... char型typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
するためのものです文字にも合うように
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型である必要はありません)が格納されます。
また、なぜ文字データの開始(または終了)は、バッファ内にあるところES _M_refdata
への呼び出しが知っている(すなわちthis+1
)
編集:this+1
はちょうど_Rep
オブジェクトの後に次の位置に内部ポインタをプッシュしていますか?
私はメモリアライメントとキャストの基本的な理解がありますが、これは私が読んだことを超えているようです。
誰かが助けてくれますか、より有益な読書資料を指摘できますか?
これは 'char'とは関係ありません。すべての単純なポインタ型を相互に 'reinterpret_cast 'することができます。 – filmor
@filmor:not true。これは厳密なエイリアシング規則に違反します。 –
@filmor:あなたはそれをやりますが、それをコンパイルしてあなたがするべきことをすると約束しません。例えば、 'char *'を 'double'にキャストした後、doubleをレジスタにロードするかもしれません。次に、 'char *'に何かを書きます。 'double'の値を変更することはありません。 –