我正在使用 Protocol Buffers和 OpensSSL生成 HMAC,然后 CBC 加密这两个字段以混淆 session cookie——类似于 Kerberos token 。
Protocol Buffers 的 API 与 std::strings 通信,并具有缓冲区缓存机制;我利用缓存机制,通过将其放置在线程本地内存中,在同一线程中进行连续调用;此外,OpenSSL HMAC 和 EVP CTX 也放置在相同的线程本地内存结构中(请参阅 this question 详细了解为什么我使用线程本地内存以及它即使在单个线程中也能实现的大量加速)。
这些 cookie 字符串的生成和反序列化,“我的算法”使用中间 void *
和 std::string
并且因为 Protocol Buffers 有一个内部存储器保留机制我想要“我的算法”的这些特性。
那么如何实现通用暂存器呢?我对 std::string 对象的 rdbuf(streambuf - strinbuf ??) 了解不多。我大概需要将它增加到执行“我的算法”期间遇到的最低常见大小。想法?
我想我的问题是:"是可重复使用的字符串的内部缓冲区,如果是这样,如何?"
编辑(新问题):
在 Vlad 的帖子之后,我似乎意识到我确实需要一个 std::string 以及一个 void * c 风格的暂存缓冲区。那么我的问题是:流行的 STL 字符串实现是否在不需要时保留内存? (我的需求可能会保持在 128 字节到 10 KB 之间)。
最佳答案
您不应期望 std::string
的全部内容驻留在 TLS 中,因为 std::string
会自行分配和重新分配数据.一个简单的想法是在堆上分配一个结构并将指向它的指针存储在 TLS 中。
编辑:
AFAIK rdbuf
是流的特征,而不是 string
的特征(参见 here 和 here)。
编辑:
我建议使用 std::vector
而不是字符串,它 should be contiguous .同样,最好只将指向 vector
的指针放入 TLS。对同一篇文章的评论说,该标准甚至要求 string
是连续的,从 &(str[0])
字符开始。
关于c++ - 线程本地内存,使用 std::string 的内部缓冲区作为 c 风格的临时内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675037/