std::string
обеспечивает max_size()
метод определения максимального количества элементов, которые он может содержать.
Однако, чтобы определить максимальную длину строки в целом, программист должен создать (возможно, пустой) строковый объект.
Если этот класс не нуждается в информации от программиста, почему бы и нет max_size()
доступно как константа времени компиляции? Есть ли какая-то информация времени выполнения, необходимая для строки, чтобы определить ее максимальный размер?
Одна из причин в том, что max_size
функция не очень полезна, и комитет не считает, что стоит пытаться ее исправить. Так что это просто так, как есть, потому что это часть документированного интерфейса.
Смотрите отчет о дефектах библиотеки № 197:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197
max_size () бесполезен для очень многих вещей, и существующая формулировка достаточно ясна для тех немногих случаев, для которых max_size () может использоваться. Ни одна из попыток изменить существующую формулировку не была улучшением.
std::string::max_size()
звонки std::allocator::max_size()
под капотом.
Согласно стандарту 20.9.6.1.10:
size_type max_size() const noexcept;
Возвращает: наибольшее значение N, для которого может быть успешным выделение вызова (N, 0).
(Смотрите также: Распределитель :: max_size)
Теоретически, реализация распределителя могла бы определить максимальный размер фрагмента памяти, который он мог бы выделить через системный вызов. Это поможет определить максимально возможный размер строки внутри определенного процесса.
Призыв к max_size()
делегируется распределителю, используемому для контейнера.
Теоретически, очень умный распределитель может вычислить его max_size
во время выполнения, например в зависимости от доступной оперативной памяти.
Это также должно работать:
enum : std::string::size_type {
npos = std::string::size_type(-1),
max_size = npos - 1
};