Поток локальной памяти, используя внутренний буфер std :: string для скретч-памяти в стиле c - PullRequest
1 голос
/ 20 апреля 2010

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

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

Генерация и десериализация, "мои алгоритмы", этих строк cookie использует промежуточные значения void * s и std::string s, и, поскольку у буферов протокола есть механизм сохранения внутренней памяти, я хочу эти характеристики для "моих алгоритмов".

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

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

Редактировать (новый вопрос):

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

1 Ответ

2 голосов
/ 20 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...