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

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

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

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

33

Решение

Одна из причин в том, что max_size функция не очень полезна, и комитет не считает, что стоит пытаться ее исправить. Так что это просто так, как есть, потому что это часть документированного интерфейса.

Смотрите отчет о дефектах библиотеки № 197:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197

max_size () бесполезен для очень многих вещей, и существующая формулировка достаточно ясна для тех немногих случаев, для которых max_size () может использоваться. Ни одна из попыток изменить существующую формулировку не была улучшением.

21

Другие решения

std::string::max_size() звонки std::allocator::max_size() под капотом.

Согласно стандарту 20.9.6.1.10:

size_type max_size() const noexcept;

Возвращает: наибольшее значение N, для которого может быть успешным выделение вызова (N, 0).

(Смотрите также: Распределитель :: max_size)

Теоретически, реализация распределителя могла бы определить максимальный размер фрагмента памяти, который он мог бы выделить через системный вызов. Это поможет определить максимально возможный размер строки внутри определенного процесса.

18

Призыв к max_size() делегируется распределителю, используемому для контейнера.

Теоретически, очень умный распределитель может вычислить его max_size во время выполнения, например в зависимости от доступной оперативной памяти.

5

Это также должно работать:

enum : std::string::size_type {
npos     = std::string::size_type(-1),
max_size = npos - 1
};
0
По вопросам рекламы [email protected]