Je voudrais obtenir les octets qu'une chaîne de std::string
occupe en mémoire, pas le nombre de caractères. La chaîne contient une chaîne multi-octets. std::string::size()
ferait-il cela pour moi?
EDIT: De plus, size()
inclut-il également le NULL
de terminaison?
std::string
opère sur les octets, pas sur les caractères Unicode, donc std::string::size()
renverra effectivement la taille des données en octets (sans la surcharge dont std::string
a besoin pour stocker les données, bien sûr).
Non, std::string
ne stocke que les données que vous lui indiquez (il n’a pas besoin du caractère NULL
de fin). Donc, il ne sera pas inclus dans la taille, à moins que vous ne créiez explicitement une chaîne avec un caractère de fin NULL
.
Vous pourriez être pédant à ce sujet:
std::string x("X");
std::cout << x.size() * sizeof(std::string::value_type);
Mais std :: string :: valeur_type est char et sizeof (char) est défini sur 1.
Cela ne devient important que si vous entrez le type de chaîne (car il peut changer à l'avenir ou à cause des options du compilateur).
// Some header file:
typedef std::basic_string<T_CHAR> T_string;
// Source a million miles away
T_string x("X");
std::cout << x.size() * sizeof(T_string::value_type);
std::string::size()
est bien la taille en octets.
Pour obtenir la quantité de mémoire utilisée par la chaîne, vous devez additionner la fonction capacity()
avec le temps système utilisé pour la gestion. Notez qu'il s'agit de capacity()
et non de size()
. La capacité détermine le nombre de caractères (charT
) alloués, alors que size()
vous indique le nombre réellement utilisé.
En particulier, les implémentations de std::string
ne * réduisent généralement pas le contenu. Par conséquent, si vous créez une chaîne puis supprimez des éléments de la fin, la size()
sera décrémentée, mais dans la plupart des cas (ceci est défini par l'implémentation) capacity()
ne le sera pas.
Certaines implémentations peuvent ne pas allouer la quantité exacte de mémoire requise, mais plutôt obtenir des blocs de tailles données pour réduire la fragmentation de la mémoire. Dans une implémentation qui utilise la puissance de deux blocs de taille pour les chaînes, une chaîne de taille 17
peut allouer autant de caractères 32
.
Oui, size () vous donnera le nombre de char
dans la chaîne. Un caractère en codage sur plusieurs octets occupe plusieurs char
.
Il y a un conflit inhérent dans la question telle qu'elle est écrite: std::string
est défini comme std::basic_string<char,...>
- autrement dit, son type d'élément est char
(1 octet), mais plus tard, vous avez indiqué que "la chaîne contient une chaîne multi-octets" ("multi-octets" == wchar_t
?).
La fonction membre size()
ne compte pas un null final. Sa valeur représente le nombre de caractères (pas d'octets).
En supposant que vous ayez l'intention de dire que votre chaîne multi-octets est std::wstring
(alias pour std::basic_string<wchar_t,...>
), l'empreinte mémoire des caractères de std::wstring
, y compris le null-terminateur est la suivante:
std::wstring myString;
...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);
Il est instructif de voir comment on pourrait écrire une fonction de modèle réutilisable qui fonctionnerait pour TOUT instanciation potentielle de std :: basic_string <> comme ceci **:
// Return number of bytes occupied by null-terminated inString.c_str().
template <typename _Elem>
inline size_t stringBytes(const std::basic_string<typename _Elem>& inString, bool bCountNull)
{
return (inString.size() + (bCountNull ? 1 : 0)) * sizeof(_Elem);
}
** Par souci de simplicité, ignore les traits et les types d'allocateur rarement spécifiés explicitement pour std::basic_string<>
(ils ont des valeurs par défaut).