Recentemente ho notato che la seguente affermazione non è vera data std::string s
.Perché non è std :: string :: max_size() == std :: string :: allocator :: max_size()
s.max_size() == s.get_allocator().max_size();
Trovo che questo sia interessante, per impostazione predefinita std::string
utilizzerà std::allocator<char>
che ha un limite teorico di size_type(-1)
(sì lo so sto assumendo complemento a 2, ma che è estraneo alla domanda reale). So che i limiti pratici saranno significativamente inferiori a questo. Su un tipico sistema x86 a 32 bit, il kernel occuperà 2 GB (forse 1 GB) dello spazio degli indirizzi, lasciando un limite superiore pratico molto più piccolo.
In ogni caso, lo std::basic_string<>::max_size()
di GNU libstdC++ sembra restituire lo stesso valore indipendentemente da ciò che dice l'allocatore utilizzato (qualcosa come 1073741820
).
Quindi la domanda rimane, perché std::basic_string<>::max_size()
non restituisce semplicemente get_allocator().max_size()
? Mi sembra che questo sia l'ipotetico limite superiore. E se l'allocazione arriva a breve, si limiterà a lanciare un std::bad_alloc
, quindi perché non provare?
Questa è più di una curiosità che altro, mi chiedevo solo perché i due sono definiti separatamente in almeno questa implementazione.
"E se. l'allocazione viene a mancare, si limiterà a lanciare uno std :: bad_alloc, quindi perché non provare? "Posso rispondere per te. Le persone potrebbero aver bisogno di elaborare stringhe di grandi dimensioni e dividerle in grossi blocchi di stringhe e, se non possono realmente dipendere da ciò che max_size gli segnala, dovranno ricorrere a limitazioni ad-hoc. – GManNickG
Vedo il tuo punto, ma non sono d'accordo. La realtà è che si deve sempre presumere che qualsiasi dimensione di stringa <= 'max_size()' abbia la possibilità di fallire perché dipende da una variabile esterna (quanto è disponibile nell'heap). –
concordato. Il mio unico punto è che dovrebbero almeno cercare di essere precisi, non solo dare un grande numero e sperare per il meglio. Dai un numero concreto una speranza per il meglio. :) Domanda difficile, però. – GManNickG