Использование для полного значения строки

В библиотеке стандарта C++, std::string имеет общедоступную функцию членства capacity() который возвращает размер внутреннего выделенного устройства хранения данных, значение, больше, чем или равный количеству символов в строке (согласно сюда). Что это может оценить использоваться для? Это имеет некоторое отношение к пользовательским средствам выделения?

13
задан dreamlax 21 May 2010 в 11:12
поделиться

7 ответов

Скорее всего, вы будете использовать функцию-член reserve () , которая устанавливает емкость как минимум равной указанному значению.

Сама функция-член capacity () может использоваться, чтобы избежать выделения памяти. Например, вы можете переработать использованные строки через пул и поместить каждую из них в корзину разного размера в зависимости от ее емкости. Затем клиент пула может запросить строку, которая уже имеет некоторую минимальную емкость.

10
ответ дан 1 December 2019 в 21:37
поделиться

У струн есть емкость и размер. Емкость указывает, сколько символов может содержать строка, прежде чем ей придется выделить больше памяти. Размер указывает, сколько символов в нем содержится в данный момент. reserve () может использоваться для установки минимальной емкости строки (он выделит память для по крайней мере этого количества символов, но может выделить больше).

Это особенно важно, если вы увеличиваете размер строки. Когда вы объединяете строку с помощью + = или append () , символы из данной строки будут добавлены в конец текущей. Если увеличение строки до этого размера не превышает емкость, тогда она просто будет использовать имеющуюся емкость. Однако, если новый размер превысит текущую емкость, тогда строке придется перераспределить память внутри и скопировать ее внутренние элементы в новую память. Если вы собираетесь делать это много, это может обойтись дорого (хотя это делается в амортизированном постоянном времени), поэтому в таком случае вы можете использовать reserve () , чтобы предварительно выделить достаточно памяти для уменьшить частоту перераспределения.

векторные функции в основном одинаковы с теми же функциями.

Лично я, хотя время от времени имел дело с capacity () и reserve () с вектором, я никогда не видел особой необходимости делать это со строкой - возможно, потому, что я обычно не выполняю достаточно конкатенаций строк в своем коде, чтобы это того стоило. В большинстве случаев конкретная строка может получить несколько конкатенаций, но этого недостаточно, чтобы беспокоиться о ее емкости. Беспокойство о емкости - это обычно то, что вы делаете, пытаясь оптимизировать свой код.

2
ответ дан 1 December 2019 в 21:37
поделиться

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

2
ответ дан 1 December 2019 в 21:37
поделиться

Функция string :: capacity () возвращает общее количество символов, которое std :: string может содержать до того, как ей придется перераспределить память, что является довольно дорогостоящей операцией.

std :: vector работает таким же образом, поэтому я предлагаю вам поискать std :: vector здесь для подробного объяснения разницы между выделенным и инициализированная память.

Обновление

Хм, я вижу, что неправильно понял вопрос, на самом деле я думаю, что никогда сам не использовал capacity () ни для std :: string, ни для std :: vector, кажется, что это редко имеет какую-либо причину, как и у вас в любом случае вызвать резерв.

6
ответ дан 1 December 2019 в 21:37
поделиться

Он дает вам количество символов, которое может содержать строка без необходимости перераспределения. Я полагаю, это может быть важно в ситуации, когда выделение было дорогостоящим, и вы хотели этого избежать, но я должен сказать, что это одна строковая функция-член, которую я никогда не использовал в реальном коде.

3
ответ дан 1 December 2019 в 21:37
поделиться

Вряд ли есть какое-либо релевантное использование. Он аналогичен std::vector::capacity. Однако одним из наиболее распространенных применений строк является присвоение. При присваивании строке std::string ее .емкость может измениться. Это означает, что реализация имеет право игнорировать старую емкость и выделять ровно столько памяти, сколько нужно.

1
ответ дан 1 December 2019 в 21:37
поделиться

Это действительно не очень полезно, и, вероятно, существует только для симметрии с вектором (в предположении, что оба будут работать внутренне одинаково).

Емкость вектора гарантированно влияет на поведение при изменении размера. Изменение размера вектора до значения, меньшего или равного емкости, не вызовет перераспределения и, следовательно, не сделает недействительными итераторы или указатели, относящиеся к элементам в векторе. Это означает, что вы можете предварительно выделить некоторое хранилище, вызвав резерв для вектора, а затем (осторожно) добавить в него элементы, изменив размер или отодвинув (и т. Д.), Будучи уверенным в том, что базовый буфер не будет перемещаться.

Однако для строки такой гарантии нет. Кажется, что эта емкость предназначена только для информационных целей - хотя даже это натянуто, так как в любом случае не похоже, что из нее можно извлечь какую-либо полезную информацию.(Что еще хуже, непрерывность строковых символов также не гарантируется, поэтому единственный способ получить строку в виде линейного буфера - это c_str () - что может вызвать перераспределение.)

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

1
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: