2010-04-20 3 views
1

Protocol BuffersOpensSSL을 생성하고 HMAC를 생성 한 다음 두 필드를 CBC로 암호화하여 세션 쿠키 - 유사한 Kerberos 토큰을 난독 화합니다.스레드 로컬 메모리, C 스타일 스크래치 메모리에 대한 std :: string의 내부 버퍼 사용

프로토콜 버퍼 API는 std :: strings와 통신하며 버퍼 캐싱 메커니즘이 있습니다. 나는 동일한 스레드에서 연속 호출을 위해 스레드 로컬 메모리에 배치하여 캐싱 메커니즘을 활용합니다. 또한 OpenSSL HMAC와 EVP CTX도 같은 스레드 로컬 메모리 구조에 놓이게됩니다 (스레드 로컬 메모리를 사용하는 이유와 단일 스레드로도 속도를 높일 수있는 이유에 대한 자세한 내용은 this question 참조).

이러한 쿠키 문자열의 생성 및 역 직렬화 ("my algorithms")는 중간의 void *std::string을 사용하며 프로토콜 버퍼에는 내부 메모리 보유 메커니즘이 있으므로 "내 알고리즘"에 이러한 특성이 필요합니다.

그래서 공통 스크래치 메모리를 어떻게 구현합니까? 나는 std :: string 객체의 rdbuf (streambuf - strinbuf ??)에 대해 많이 모른다. 나는 "내 알고리즘"을 실행하는 동안 가장 적은 공통 크기로 자랄 필요가있을 것입니다. 생각?

내 질문에 : "재사용 가능한 문자열의 내부 버퍼이며, 그렇다면 어떻게됩니까?"

편집 (새로운 질문) :

그것은 내가 표준 : : 문자열뿐만 아니라 무효 * C 스타일의 스크래치 버퍼가 필요합니까 블라드의 포스트 후 반사 uppon 보인다. 내 질문에 다음 될 것입니다 : 인기있는 stl 문자열 구현 그들이 필요하지 않을 때 메모리를 유지합니까? (필자의 필요는 128 바이트에서 10KB 사이에 머무를 것입니다).

답변

2

std::string은 TLS에 상주해야합니다. std::string은 데이터 자체에 대한 할당 및 재 할당을하기 때문에. 간단한 개념은 힙에 구조체를 할당하고 TLS에 포인터를 저장하는 것입니다.

편집 :
AFAIK rdbuf하지 string의 (herehere 참조), 스트림의 기능입니다.

편집 :
내가 대신 문자열의 std::vector을 사용하는 것이 좋습니다 것, 그것은 should be contiguous. 다시 말하지만, vector에 대한 포인터를 TLS에 두는 것이 좋습니다. 동일한 기사에 대한 의견에 따르면 표준에서는 string&(str[0]) char부터 연속적으로 연결되어야한다고합니다.

+0

힙에 유지되는 메모리에 대한 활성 참조를 위해 문자열 개체를 유지하려고합니다. D. 네, 맞을 것으로 생각합니다. 아마도 C 스타일의 호출을위한 별도의 스크래치 버퍼를 관리하고 필요에 따라 확장해야 할 것입니다. 특히 일부 호출에는 "to"요소와 "from"요소가 모두 필요하기 때문에 특히 그렇습니다. –

+0

별도의 스크래치 버퍼를 유지하면서 문자열을 유지하는 것이 여전히 할당 확률을 낮추는 지 궁금합니다. 즉, 평균 문자열 객체가 필요하지 않을 때 메모리에서 계속 유지합니까? –

+0

확인, 확인, 벡터입니다 : D –

관련 문제