Je suis un peu perdu avec certaines des implémentations de base des chaînes de caractères. J'ai parcouru les sources pour comprendre le fonctionnement interne et apprendre de nouvelles choses. Je n'arrive pas à comprendre entièrement comment la mémoire est gérée.
Quelques informations sur l'implémentation de base des chaînes de caractères.
-
L'allocateur brut est pour le type char
typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
-
...puis lors de l'allocation, Rep est placé dans le tampon alloué
__size
est calculé pour correspondre également aux caractèressize_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep); void* __place = _Raw_bytes_alloc(__alloc).allocate(__size); _Rep *__p = new (__place) _Rep;
-
Voici comment les données de caractères sont extraites du tampon _Rep.
_CharT* _M_refdata() throw() { return reinterpret_cast<_CharT*>(this + 1); }
-
Mise en place du personnage - pour un type de voie
_M_assign(__p->_M_refdata(), __n, __c);
Ce qui me dérange, c'est que l'allocateur brut est de type char, mais que la mémoire allouée peut contenir un objet _Rep, plus les données du caractère (qui ne doivent pas nécessairement être de type char).
Par ailleurs, pourquoi (ou plutôt comment) l'appel à la fonction _M_refdata
savoir où se trouve le début (ou la fin) des données du caractère dans la mémoire tampon (c'est à dire this+1
)
Edit : fait this+1
il suffit de pousser le pointeur interne à la position suivante après le _Rep
objet ?
J'ai une connaissance de base de l'alignement et du moulage de la mémoire, mais cela semble aller au-delà de tout ce que j'ai lu.
Quelqu'un peut-il m'aider ou m'indiquer des lectures plus informatives ?