1

我正在使用协议缓冲区OpensSSL生成 HMAC,然后 CBC 加密这两个字段以混淆会话 cookie——类似的 Kerberos 令牌。

Protocol Buffers 的 API 与 std::strings 通信,并具有缓冲区缓存机制;我利用缓存机制,将同一线程中的连续调用放在线程本地内存中;此外,OpenSSL HMAC 和 EVP CTX 也被放置在同一个线程本地内存结构中(请参阅这个问题,了解为什么我使用线程本地内存以及即使使用单个线程也能实现大量加速)。

这些 cookie 字符串的生成和反序列化“我的算法”使用中介void *s 和std::strings,并且由于 Protocol Buffers 具有内部内存保留机制,我希望这些特征用于“我的算法”。

那么如何实现一个通用的暂存器呢?我对 std::string 对象的 rdbuf(streambuf - strinbuf ??) 了解不多。我大概需要将它增长到执行“我的算法”期间遇到的最低常见大小。想法?

我想我的问题是:“字符串的内部缓冲区是否可重用,如果是,如何?”

编辑(新问题):

在 Vlad 的帖子之后,我似乎确实需要一个 std::string 以及一个 void * c 样式的暂存缓冲区。那么我的问题是:流行的 stl 的字符串实现在不需要时会保留内存吗?(我的需求可能会保持在 128 字节到 10 KB 之间)。

4

1 回答 1

2

您不应该期望您的全部内容std::string都驻留在 TLS 中,因为std::string它会自行对数据进行分配和重新分配。一个简单的想法是在堆上分配一个结构并将指向它的指针存储在 TLS 中。

编辑:
AFAIKrdbuf是流的一个特性,而不是string(见这里这里)。

编辑:
我建议使用std::vector而不是字符串,它应该是 contiguous。同样,最好只放置一个指向vectorTLS 的指针。对同一篇文章的评论说,该标准甚至string要求是连续的,从&(str[0])char 开始。

于 2010-04-20T12:52:28.513 回答