2010-04-20 22 views
1

我使用Protocol BuffersOpensSSL生成HMAC,然後CBC加密兩個字段混淆會話cookie - 類似的Kerberos令牌。線程本地內存,使用std :: string的內部緩衝c風格的暫存內存

協議緩衝區的API與std :: strings進行通信並具有緩衝區緩存機制;我利用緩存機制,通過將其放入線程本地內存中,在同一線程中進行連續調用;此外,OpenSSL HMAC和EVP CTX也放置在相同的線程本地內存結構中(有關我爲什麼使用線程本地內存的一些細節,請參閱this question,即使使用單個線程也可以實現大量加速)。

的產生和反序列化,「我的算法」,這些餅乾的字符串使用中介void * S和std::string S和自Protocol Buffers的內部有一個內存固定架我想這些特點爲「我的算法」。

那麼我該如何實現一個通用的暫存內存?我不太瞭解std :: string對象的rdbuf(streambuf - strinbuf ??)。我認爲需要將其擴大到執行「我的算法」期間遇到的最低常見尺寸。想法?

我的問題我猜會是:「是可重用字符串的內部緩衝區,如果是這樣,怎麼辦?」

編輯(新題):

看來uppon後弗拉德的反思後,我確實需要爲std :: string以及一個void * C風格的臨時緩衝區。那麼我的問題是:當流行的stl的字符串實現不需要它時保留內存嗎? (我的需求可能會保持在128字節到10 KB之間)。

回答

2

您不應該期望std::string的全部內容駐留在TLS中,因爲std::string會自行對數據進行分配和重新分配。一個簡單的想法是在堆上分配一個結構並在TLS中存儲一個指向它的指針。

編輯:
AFAIK rdbuf是流的功能,而不是string(見herehere)。

編輯:
我會建議使用std::vector而不是字符串,它should be contiguous。再次強調,只需將指向vector的指針放入TLS即可。同一篇文章的評論說,該標準甚至要求string是連續的,從&(str[0])字符開始。

+0

我希望保留字符串對象,以便對其保留在堆上的內存進行主動引用:D。是的,我認爲你可能是對的,我可能需要爲c樣式調用管理一個單獨的臨時緩衝區,並在需要時進行擴展。特別是因爲一些調用需要「to」元素和「from」元素。 – 2010-04-20 12:53:27

+0

我不知道如果保留一個字符串,同時還保留一個獨立的scratch buffer,仍然意味着分配的可能性較低 - 也就是說,當不需要它時,平均字符串對象是否保留在內存中? – 2010-04-20 12:57:41

+0

好的,好的,它是矢量:D – 2010-04-20 13:31:21