2010-11-25 5 views
1

Dans la mise en œuvre GNU de std::string, son _S_empty_rep_storage est défini comme:Pourquoi le rep vide de std :: string est-il tel qu'il est?

template<typename _CharT, typename _Traits, typename _Alloc> 
    typename basic_string<_CharT, _Traits, _Alloc>::size_type 
    basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[ 
    (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1)/sizeof(size_type) 
    ]; 

Pourquoi est-il défini en termes de size_type plutôt que de simplement char? Pourquoi n'est-il pas défini comme:

template<typename _CharT, typename _Traits, typename _Alloc> 
    _CharT 
    basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[ 
    sizeof(_Rep_base) + sizeof(_CharT) 
    ]; 

?

Pour votre information: La raison pour laquelle je demande est parce que je suis mise en œuvre ma propre classe de chaîne (qui a des exigences différentes que std::string ne répond pas) donc je voudrais comprendre autant que possible quant à la façon std::string est implémenté.

+0

Parce que le résultat n'est pas le même? –

+0

"plutôt que simplement char" <- Voulez-vous dire "plutôt que simplement _CharT" là? –

+0

"l'implémentation de ma propre classe de chaînes" comporte des points d'interrogation écrits dessus. Êtes-vous absolument sûr de devoir faire cela? – CJBrew

Répondre

1

La taille de _CharT peut varier, en particulier si vous utilisez wchar_t plutôt que char.

Je réalise que seulement répond à une partie de la question. Je ne suis pas sûr que le contenu de Rep_base soit défini comme il est, mais en général avec le STL, il vaut mieux ne pas trop se soucier de son fonctionnement; juste être heureux que ça le fasse. Parce que vous êtes très (très) peu susceptible de trouver un bogue aussi fondamental que possible.

1

Alignement et arrondi. La partie + sizeof(size_type) - 1)/sizeof(size_type) arrondit au nombre immédiatement supérieur d'éléments size_type.

+0

Je comprends l'arrondissement. Ce qui n'était pas clair était l'alignement. Cependant, je pense que vous obtiendriez un meilleur alignement (sans parler du code plus clair) si un simple tableau _CharT était placé comme la seule chose à l'intérieur d'une structure simple qui garantirait (bien sûr) un bon alignement de structure, ce que je pense vous voudriez puisque le stockage est pour un "rep" qui est un struct (class). –