31 votes

Pourquoi l'implémentation de std::to_string crée-t-elle un tampon de 4 fois la taille du type ?

C++11 introduit std::to_string J'ai donc jeté un coup d'œil à une implémentation : elle appelle vsnprintf interne. D'accord, mais pourquoi le paramètre de taille est toujours égal à 4 fois la taille du type ?

 inline string
 to_string(int __val)
 { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int),
                                          "%d", __val); }

 inline string
 to_string(unsigned __val)
 { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf,
                                          4 * sizeof(unsigned),
                                          "%u", __val); }

 inline string
 to_string(long __val)
 { return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long),
                                          "%ld", __val); }

42voto

Dieter Lücking Points 10938

Le nombre maximal de chiffres binaires d'une valeur N-décimale est la valeur plafond de (N * log(10) / log(2)). Un seul chiffre décimal nécessite ceil(3,32) chiffres binaires, soit 4.

Pour les tailles de 8 bits, c'est le cas :

Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).

Pour le signe (frais généraux et allocation) vous obtenez :

Decimals = 4 * Size.

Note : Une conversion avec snprintf d'un seul caractère signé nécessite 5 octets (y compris le signe et le zéro de fin). Pour les valeurs dont la taille est supérieure à un octet, Decimals = 4 * Size fournit un résultat, qui est suffisamment important.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X