2010-06-08 4 views
3

이 같은 코드를 작성하도록 사용이제는 strstream 기능이 중단되어 어떻게 폐기 될 수 있습니까?

void fun(char *buff, unsigned size) 
{ 
    std::strstream str(buff, size); 
    str << "hello world: " << 5; 
} 

이렇게 I는 임의의 버퍼를 통해 스트림 출력을 사용할 수있다. 이 기술은 효율적 (할당 없음)과 유용 (스트림!)합니다. 이제는 std :: strstream이 더 이상 사용되지 않습니다.이 코드로 얻을 수있는 속도와 유연성을 어떻게 얻을 수 있습니까?

답변

5

표준 라이브러리는 그 기능을 제공하지 않습니다. 그러나 Boost는 일반적인 스트림과 배열 소스/싱크를 사용합니다.

Boost Generic Stream
Boost Array Devices

char buff[size]; 
boost::stream<boost::array_sink> out(buff, size); 
out << "Hello, world!"; 

(코드 검증되지 않은) 이제 표준 : : strstream는 가 어떻게 같은 속도 + 내가 함께 얻을 수있는 유연성을 얻을 수 있습니다되지 않습니다

+0

좋은 사람 감사합니다! – chila

2

시도 :

#include <sstream> 
std::stringstream str; 
str << "hello world: " << 5; 

편집 : 죄송합니다, 나는 이상 질문을 간단하게 생각합니다. 이 기능은 sstream으로 변경할 때 제거되는 기능 중 하나입니다. 여기에 유사한 내용이 있습니다 (나는 이것이 작동한다고 생각합니다) :

#include <sstream> 
void fun(char *buff, unsigned size) 
{ 
    std::stringstream str; 
    str << "hello world: " << 5; 
    memcpy(buff, str.str().c_str(), size); 
} 
+1

저는 포스터가 메모리 버퍼를 직접 처리하는 방법을 요청했다고 생각합니다. –

+1

std :: stringstream은 쓰기와 동시에 할당합니다. 그는 고정 된 크기의 미리 할당 된 버퍼를 제공하려고합니다. –

+0

@Mattias @Peter : 아, 나는 단순히 strstream에서 stringstream으로의 전환을 놓친다 고 생각했습니다. 나는 갱신을 할 것이다. –

-1

이 코드 ?

이유가 없어 졌다고 생각합니다. 버퍼의 끝에 도달하는 스트림의 경우를 처리 할 때 나는 과거에 많은 이식성 문제를 겪었습니다. 단일성이 부족하여 아마도 버전을 사용하여 std :: string에 비해 deprecation이 트리거되었습니다.

그렇지 않으면 iostream 및 "< <"연산자의 맥락에서 "속도"에 대해 언급하는 것이 즐겁습니다. 나는 과거에 많은 테스트를했고 iostreams는 좋은 ol 'snprintf()를 따라 잡을 수 없다. "< <"연산자의 효과 - 모든 요소에 대해 함수 호출을하는 것은 여하튼 당신이 그것을보고 항상 더 느릴 것입니다. 그것은 엄격한 유형 검사 비용입니다.

+0

호출 된 함수가 인라인되지 않으면 완전한 최적화 (-O2, -fast 등)를 사용하여 코드를 테스트하십시오. – chila

+0

"_ 엄격한 유형 검사 비용입니다 ._"말도 안됩니다. – curiousguy

+1

한편,'printf'는 형식 문자열을 구문 분석해야합니다. 그래서 이것은 명백한 방법이 아닙니다. 사실, 일부 구현의 경우 'iostream'도 속도가 빠르며 느린 속도 (MSVC)는 느린 속도입니다. 즉, 'printf'위에 구현됩니다. – ybungalobill

관련 문제