33 votes

Pourquoi std :: string :: max_size n'est-il pas une constante au moment de la compilation?

std::string fournit une méthode max_size() pour déterminer le nombre maximal d'éléments qu'il peut contenir.

Cependant, pour déterminer la longueur maximale d'une chaîne en général, le programmeur doit créer un objet chaîne (éventuellement vide).

Si cette classe n'a pas besoin d'informations du programmeur, pourquoi max_size() n'est-il pas disponible comme constante de compilation? Existe-t-il une sorte d'informations d'exécution nécessaires à une chaîne pour déterminer sa taille maximale?

21voto

Bo Persson Points 42821

Une des raisons est que l' max_size fonction n'est pas très utile à tous, et le comité ne pense pas que cela vaut la peine d'essayer de le réparer. Donc, il est juste à gauche de la façon dont il est, parce que c'est une partie de la documentation de l'interface.

Voir bibliothèque de rapport de défaut #197:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197

max_size() n'est pas utile pour beaucoup de choses, et le libellé actuel est suffisamment clair pour que le peu de cas que max_size() peut être utilisé pour. Aucune de ces tentatives pour modifier le libellé d'une amélioration.

18voto

Mr. kbok Points 4374

std::string::max_size() des appels std::allocator::max_size() sous le capot.

Selon la norme, 20.9.6.1.10:

size_type max_size() const noexcept;

Retourne: La plus grande valeur de N pour laquelle l'appel d'allouer(N,0) peut réussir.

(Voir aussi: l'allocateur::max_size)

Théoriquement, un allocateur de la mise en œuvre pourrait être en mesure de travailler sur la taille maximale d'un segment de mémoire il pourrait allouer, par l'intermédiaire d'un syscall. Cela permettrait de déterminer la plus grande taille possible pour une chaîne de caractères, à l'intérieur d'un processus spécifique.

5voto

Andrey Points 5028

L'appel à max_size() est délégué à l'allocateur utilisé pour le conteneur.

En théorie, un allocateur très intelligent pourrait calculer son max_size lors de l'exécution, par exemple en fonction de la RAM disponible.

0voto

Pubby Points 29386

Si max_size était une constante de temps de compilation, alors elle devrait être valable pour tous les ordinateurs sur lesquels le binaire était exécuté.

De toute évidence, si je compile sur un ordinateur avec 32 Go de RAM et un max_size renvoie 1 Go, il ne devrait pas retourner la même valeur si j'exécute le binaire sur un ordinateur avec 64 Mo de RAM!

0voto

StackedCrooked Points 12247

Cela devrait également fonctionner:

 enum : std::string::size_type {
    npos     = std::string::size_type(-1),
    max_size = npos - 1
};
 

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