Подтвердить что ты не робот

Почему не std::string:: max_size константа времени компиляции?

std::string предоставляет метод max_size() для определения максимального количества элементов, которые он может содержать.

Однако, чтобы выработать максимальную длину строки в целом, программисту необходимо создать (возможно, пустой) строковый объект.

Если этот класс не нуждается в какой-либо информации от программиста, почему нет max_size() в качестве константы времени компиляции? Есть ли какая-то информация о времени выполнения, необходимая для того, чтобы строка выработала свой максимальный размер?

4b9b3361

Ответ 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
};