Локальная память потока, использование внутреннего буфера std :: string для временной памяти в стиле c

Я использую протоколы буферов и OpensSSL для генерации, HMAC, а затем CBC шифруют два поля, чтобы скрыть файлы cookie сеанса - аналогично токенам Kerberos.

API протокольных буферов взаимодействует с std :: strings и имеет механизм кэширования буфера; Я использую механизм кэширования для последовательных вызовов одного и того же потока, помещая его в локальную память потока; кроме того, OpenSSL HMAC и EVP CTX также помещаются в одну и ту же структуру локальной памяти потока (см. этот вопрос для некоторых подробностей о том, почему я использую локальную память потока и огромное количество ускорения, которое она дает даже с одним потоком).

Для генерации и десериализации, «моих алгоритмов», этих строк cookie используются промежуточные void *s и std::strings, и, поскольку Protocol Buffers имеет внутренний механизм сохранения памяти, мне нужны эти характеристики для «моих алгоритмов».

Итак, как мне реализовать обычную рабочую память? Я мало что знаю о rdbuf (streambuf - strinbuf ??) объекта std :: string. Предположительно, мне нужно было бы увеличить его до наименьшего общего размера, который когда-либо встречался во время выполнения «моих алгоритмов». Мысли ?

Думаю, у меня будет следующий вопрос: «Можно ли многократно использовать внутренний буфер строки, и если да, то как?»

Изменить (новый вопрос):

После сообщения Влада мне кажется, что мне действительно нужен std :: string, а также буфер нуля в стиле void * c. Тогда у меня будет вопрос: сохраняют ли популярные строковые реализации stl память, когда она им не нужна? (мои потребности, вероятно, останутся от 128 байт до 10 КБ).


person Hassan Syed    schedule 20.04.2010    source источник


Ответы (1)


Не следует ожидать, что все содержимое вашего std::string будет находиться в TLS, поскольку std::string самостоятельно выделяет и перераспределяет данные. Простая идея - выделить структуру в куче и сохранить указатель на нее в TLS.

Изменить:
AFAIK rdbuf - это функция потоков, а не string (см. здесь и здесь).

Изменить:
Я бы предложил использовать std::vector вместо строки, это должен быть непрерывным. Опять же, возможно, лучше поместить в TLS просто указатель на vector. В комментариях к той же статье говорится, что стандарт требует, чтобы даже string был непрерывным, начиная с &(str[0]) char.

person Vlad    schedule 20.04.2010
comment
Я надеюсь сохранить строковый объект для его активной ссылки на память, которую он сохраняет в куче: D. Да, я думаю, что вы правы, мне, вероятно, нужно будет управлять отдельным буфером царапин для вызовов c-style и при необходимости увеличивать его. Тем более, что для некоторых вызовов потребуется как элемент to, так и элемент from. - person Hassan Syed; 20.04.2010
comment
Интересно, будет ли сохранение строки при одновременном сохранении отдельного буфера царапин по-прежнему означать меньшую вероятность выделения - т.е. хранит ли средний строковый объект память, когда она ему не нужна? - person Hassan Syed; 20.04.2010
comment
хорошо, я использую вектор и изменение размера, а вектор не возвращает память; и я использую строку - надеясь, что она тоже не вернет память: D - person Hassan Syed; 20.04.2010
comment
@Hassan: std::vector должен сохранять память, если вы ее не используете, потому что вы потенциально можете получить к ней доступ в любое время. Однако если вы расширяете вектор, он может изменить расположение памяти (если текущий блок памяти, который он использует, недостаточно велик). Надеюсь, это проясняет проблему. - person Vlad; 21.04.2010