2009-12-21 5 views
16

나는 내 응용 프로그램에서 문자열과 오류 메시지를 구성하는 데 광범위하게 std::stringstream을 사용합니다. stringstreams은 대개 수명이 매우 짧은 자동 변수입니다.std :: stringstream을 사전 할당해야합니까?

이러한 사용으로 인해 모든 변수에 대해 힙 재 할당이 발생합니까? 임시에서 클래스 멤버 stringstream 변수로 전환해야합니까?

후자의 경우 어떻게 버퍼 stringstream을 예약 할 수 있습니까? (충분히 큰 문자열로 초기화해야합니까? 아니면 좀 더 우아한 방법이 있습니까?)

답변

11

실행 결과를 프로파일 링하여 속도 저하의 원인을 찾았습니까?

용도를 고려하십시오. 코드의 정상적인 흐름을 벗어나는 오류 메시지가 대부분입니까? 어떤 할당이 이제 stringstream을 위해 일어나기 전에

지금까지 공간을 확보로 ...

일부 구현은 아마도 작은 버퍼를 보유합니다. std :: string의 많은 구현은 이렇게합니다.

또 다른 옵션은 (안된!) 될 수

std::string str; 
str.reserve(50); 
std::stringstream sstr(str); 

gamedev thread에서 좀 더 아이디어를 찾을 수 있습니다.

편집 :

stringstream's rdbuf 주위에 일 처리하는 것도 해결책이 될 수 있습니다. 이 방법은 아마도 매우 잘못 생각하기 쉽기 때문에 be sure it's absolutely necessary을 입력하십시오. 명확히 우아하지 않거나 간결하지 않습니다.

+0

좋은 조언; 그러나 50을 예약 한 다음 해당 문자열을 복사하면 작은 힙이 아닌 버퍼 최적화 (구현에 버퍼 최적화가있는 경우)가 무시 될 수 있습니다. 자신 만의 streambuf를 작성하고 싶다면 모든 버퍼 관리를 정확하게 제어 할 수 있습니다. 그런 다음 ostream (또는 istream 또는 iostream을 사용 하겠지만 질문은 출력 형식이 여기에 관련되어 있음을 나타냅니다.)은 rdbuf를 통해 stringstream의 버퍼를 변경하는 대신 streambuf를 사용하십시오. –

+6

stringstream은 str의 내용 길이 (0) 이상을 예약하지 않는다고 생각합니다. cplusplus.com에 따르면 : "str의 복사본을 가진 ostringstream 객체를 내용으로 생성합니다." 참조는 "문자열 내용의 사본"입니다. 명시 적으로 동일한 양의 메모리를 예약한다고 명시하지는 않습니다. 이 생성자를 사용하여 메모리를 예약하는 것에 대해 언급하는 소스를 찾을 수 없습니다. – NickSoft

+0

위에 사용 된 생성자는 더 이상 유효하지 않습니다. no-copy 생성자가 제거 된 것을 볼 수 있습니다. http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069

1

잘 모르겠으나, 이 stringstream과 밀접하게 관련되어 있다고 생각됩니다. string. 그래서 ss.seekp(reserved-1); ss.put('\0');을 사용하여 reserved 바이트 내에서 stringss 인 바이트를 예약 할 수 있다고 생각합니다. 사실 ss.seekp(reserved); ss.trunc();과 같은 것을보고 싶지만 스트림에 대해서는 trunc() 메소드가 없습니다.

관련 문제