Récemment, j'ai remarqué que l'instruction suivante n'est pas vraie étant donné std::string s
.Pourquoi std :: string :: max_size() == std :: string :: allocator :: max_size()
s.max_size() == s.get_allocator().max_size();
Je trouve cela intéressant, par défaut std::string
utilisera std::allocator<char>
qui a une limite théorique de size_type(-1)
(oui je sais je suppose que le complément de 2, mais c'est sans rapport avec la question réelle). Je sais que les limites pratiques seront beaucoup moins importantes. Sur un système x86 32 bits typique, le noyau occupera 2 Go (peut-être 1 Go) de l'espace d'adressage, ce qui laisse une limite supérieure pratique beaucoup plus petite.
Quoi qu'il en soit, le std::basic_string<>::max_size()
de GNU libstdC++ semble retourner la même valeur indépendamment de ce que dit l'allocateur qu'il utilise (quelque chose comme 1073741820
).
Donc la question demeure, pourquoi ne pas std::basic_string<>::max_size()
juste retourner get_allocator().max_size()
? Il me semble que c'est la limite supérieure hypothétique. Et si l'allocation est courte, il faudra juste lancer un std::bad_alloc
, alors pourquoi ne pas essayer?
Ceci est plus d'une curiosité que toute autre chose, je me demandais juste pourquoi les deux sont définis séparément dans au moins cette mise en œuvre.
« Et si. l'allocation arrive à court, il va juste lancer un std :: bad_alloc, alors pourquoi ne pas essayer? "Je peux répondre à cela pour vous. Les utilisateurs peuvent avoir besoin de traiter des chaînes de caractères volumineuses et de les diviser en segments de chaînes de caractères volumineux, et s'ils ne peuvent pas réellement dépendre des rapports max_size, ils devront recourir à des limitations ad-hoc. – GManNickG
Je vois ce que vous voulez dire, mais je ne suis pas d'accord. La réalité est que vous devez toujours supposer que toute taille de chaîne <= 'max_size()' a la possibilité d'échouer car elle dépend d'une variable externe (combien est disponible dans le tas). –
D'accord. Mon seul point est qu'ils devraient au moins essayer d'être précis, pas seulement donner un grand nombre et espérer le meilleur. Donnez un nombre pratique d'espoir pour le meilleur. :) Question difficile, cependant. – GManNickG