2012-10-30 1 views
32

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

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

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

+1

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

+0

@ Loki: Можете ли вы предоставить ссылку для вашего заявления? Я спрашиваю, потому что я уверен, что вы ошибаетесь (для 'max_size' применительно к строкам, а распределители - другая история). – Nemo

+1

@Nemo: В стандарте нет ничего, что говорит, что оно постоянно. Тем не менее, он может быть постоянным в некоторых реализациях.(** Я предполагаю здесь ** ->) Если бы стандартный комитет хотел, чтобы он был константой, он бы сделал его константной переменной типа 'std :: string :: npos', но чтобы предоставить больше возможностей для гибкости это метод. –

ответ

21

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

См Библиотеки дефекты отчет # 197:

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

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

+1

+1. Это действительно бесполезная функция. То, что возвращает 'std :: string :: max_size()' _this, - это максимальная длина строки, которую она могла бы удержать, если у вас было достаточно памяти. Удивило так много неправильных ответов здесь. –

+0

Только дистанционно правильный ответ. – Nemo

5

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

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

+1

Нет, это не _ делегировано распределителю в соответствии со стандартом. Возможно, это в вашей конкретной реализации, но это не имеет значения. Cite, где spec говорит что-нибудь о контейнере, делегирующем этот вызов его распределителю, и я удалю свой downvote. – Nemo

+0

@Nemo: Да, 'string :: max_size()' не требуется для этого стандартом. Я говорил о возможной реализации. – Andrey

18

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)

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

+1

Я обновил ссылку на стандарт. – slaphappy

+5

В стандарте _not_ требуется строка 'max_size' для вызова' max_size' распределителя. Описание стандарта для 'string' относится к« требованиям контейнера »в разделе 23.1, которое определяет' max_size' как «' size() 'самого большого возможного контейнера». Он вообще не относится к распределителям, поэтому этот ответ просто неверен. – Nemo

0

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

enum : std::string::size_type { 
    npos  = std::string::size_type(-1), 
    max_size = npos - 1 
}; 
+0

То, что вы подразумеваете, уже существует как std :: string :: npos, которое не совпадает с max_size. – leetNightshade

+0

Кроме того, max_size на x86 приведет к «самому» size_type (-2), так как size_type (-1) считается недопустимым размером (npos). – leetNightshade

+0

@leetNightshade Действительно. Починил это. – StackedCrooked