线程本地内存,使用std :: string的内部缓冲区用于c风格的Scratch Memory

时间:2010-04-20 12:29:45

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

我正在使用Protocol BuffersOpensSSL来生成HMAC,然后CBC对这两个字段进行加密以混淆会话cookie - 类似的Kerberos令牌。

Protocol Buffers'API与std :: strings通信,并具有缓冲区缓存机制;我利用缓存机制,通过将它放在线程本地内存中,在同一个线程中进行连续调用;此外,OpenSSL HMAC和EVP CTX也放置在相同的线程本地内存结构中(有关我使用线程本地内存的原因以及即使使用单个线程也能实现的大量加速,请参阅this question)。 / p>

这些cookie字符串的生成和反序列化“我的算法”使用了中间void *std::string,并且由于协议缓冲区具有内部内存保留机制,我希望这些特性用于“我的算法” ”

那么如何实现常见的临时存储器?我不太了解std :: string对象的rdbuf(streambuf - strinbuf ??)。我可能需要将它增长到执行“我的算法”期间遇到的最低常见大小。想法?

我的问题我猜是:“是可重复使用的字符串的内部缓冲区,如果是,那怎么办?”

编辑(新问题):

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

1 个答案:

答案 0 :(得分:2)

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

编辑:
AFAIK rdbuf是流的一项功能,而不是string的功能(请参阅herehere)。

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