c++ - 线程本地内存,使用 std::string 的内部缓冲区作为 c 风格的临时内存

标签 c++ caching thread-local-storage scratch-memory

我正在使用 Protocol BuffersOpensSSL生成 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 的特征(参见 herehere)。

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

关于c++ - 线程本地内存,使用 std::string 的内部缓冲区作为 c 风格的临时内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675037/

相关文章:

caching - 让 leiningen 缓存包

c# - 如何将 Parallel.ForEach 与线程局部状态一起使用?

c++ - 无法使用 DWM 在自定义窗口框架上绘制

c++ - 使用 libftdi 或 libusb 按名称打开设备

ruby-on-rails - 如何使用 config.cache_store = :redis_store? 按环境命名缓存

c++ - 如何优化此数组抽取/下采样程序的内存访问模式/缓存未命中?

c - 确定 `_Thread_local` 标识符链接的正式方法是什么?

visual-c++ - __addgs* 如何使用,什么是 GS?

c++ - 编辑 ui 文件时,不会重新生成 cpp.obj 文件

类似 MPI 的 C++ 消息传递库