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