Недавно я заметил, что следующая инструкция неверна с учетом std::string s
.Почему не std :: string :: max_size() == std :: string :: allocator :: max_size()
s.max_size() == s.get_allocator().max_size();
Я нахожу это интересным, по умолчанию будет использовать std::string
std::allocator<char>
, которая имеет теоретический предел size_type(-1)
(да я знаю, я предполагаю, что 2 в дополнение, но это не связано с фактическим вопросом). Я знаю, что практические ограничения будут значительно меньше этого. В типичной 32-битной системе x86 ядро будет занимать 2 ГБ (возможно, 1 ГБ) адресного пространства, оставляя гораздо меньший практический верхний предел.
Как бы то ни было, GNU libstdC++ std::basic_string<>::max_size()
возвращает одинаковое значение независимо от того, что использует его распределитель (например, 1073741820
).
Таким образом, вопрос остается, почему не std::basic_string<>::max_size()
просто верните get_allocator().max_size()
? Мне кажется, что это гипотетический верхний предел. И если выделение будет коротким, оно просто выбросит std::bad_alloc
, так почему бы не попробовать?
Это скорее любопытство, чем что-либо еще, мне просто интересно, почему эти два определяются отдельно, по крайней мере, в этой одной реализации.
«И если. распределение будет коротким, оно просто выбросит std :: bad_alloc, так почему бы не попробовать? »Я могу ответить на это за вас. Людям, возможно, потребуется обработать большие строки и разделить их на большие строковые фрагменты, и если они не могут фактически зависеть от того, что ему сообщает max_size, им придется прибегать к специальным ограничениям. – GManNickG
Я вижу вашу точку зрения, но я не согласен. Реальность такова, что вам всегда приходится предполагать, что любой размер строки <= 'max_size()' имеет возможность сбоя, потому что он зависит от внешней переменной (сколько доступно в куче). –
Согласовано. Мой единственный момент - они должны хотя бы попытаться быть точными, а не просто дать большое количество и надеяться на лучшее. Дайте практический номер надежда на лучшее. :) Жесткий вопрос. – GManNickG