2015-01-30 9 views
2

나는 표준 : : ostringstream를 사용하여 수 std 번호를 쓰는 코드 : 문자열을 작성하는 문자열을 지정 지정명시 적으로 표준에 대한에 :: ostringstream

 template<class T> 
     class Converter 
     { 
     private: 
      static std::string s_buffer;  
     public: 
      static const char* Out(const T& val) 
      { 
       std::ostringstream os; 
       os << val; 
       s_buffer = os.str(); 
       return(s_buffer.data()); 
      } 
     }; 

Converter::Out이 많은라고합니다. 프로파일 러에 너무 많이 나타납니다. 그리고 본질적으로, 여기에서 발생하는 것은 :

  1. ostringstream의 인스턴스는 그것은에 쓰기 버퍼를 생성하고 쓰는
  2. 내가 정적 문자열 버퍼가 그것을
  3. 을 반환 할 것을 복사 생성

정적 문자열에 직접 쓰는 스트림을 얻을 수 있으므로 복사본을 피할 수 있다고 생각합니다. 성능이 약간 향상 될 수 있습니다. 하지만 어떻게 할 수 있습니까? std::ostringstream은 컨스트럭터에서 const std::string 만 받아 들일 수 있습니다. 이는 예비 칠일 것이지, 쓸 버퍼가 아닙니다. 내가 하나를 발견하지 않았지만 어쩌면 부스트

+3

http://en.cppreference.com/w/cpp/ : 부스트가 옵션 인 경우

template<class T> class Converter { private: static struct Buf : public std::ostringstream, public std::basic_stringbuf<char> { Buf() { static_cast<std::basic_ios<char>&>(*this).rdbuf(this); } void clear() { setp(pbase(), pbase()); } char const* c_str() { *pptr() = '\0'; return pbase(); } } s_buf; public: static const char* Out(const T& val) { s_buf.clear(); s_buf << val; return s_buf.c_str(); } }; 

, 당신은 string 또는 vector<char>의 지원 boost::iostreams::filtering_ostream를 사용할 수 있습니다 쉽게 상속을 통해 그 해결 할 수 string/basic_string/to_string – user657267

+0

['streambuf :: pubsetbuf'] (http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf)를 호출하여 자신의 버퍼를 지정한 다음 'streambuf'에서 스트림을 생성 할 수 있습니다. 하지만 불행하게도 크기를 조정할 수없는 버퍼를 제공합니다. – jrok

+0

@vsoftco 나는 이것이 완벽하게 표준을 따르는 코드라고 생각한다. 그리고 좋은 구현이 그것을 정확히 기대할 것이다. 문제는 실제로 얼마나 많은 구현입니다 ... – jrok

답변

2

당신은 rdbuf() 방법을 사용하여 ostringstream의 버퍼에 액세스 할 수 있습니다 :(..., 어떤 대안을 가지고 불행하게도, 기본 문자 버퍼에 대한 액세스를 보호하지만, 당신을. http://lists.boost.org/boost-users/2012/09/75887.php

+0

원래 프로그램에 비해이 기능의 이점은 무엇입니까? – 0x499602D2

+0

@ 0x499602D2 문자열 복사가 필요하지 않습니다. – ecatmur

+0

와우, 당신이 제안하는 코드는 정말 날아갑니다! Converter :: Out에서 소비 한 총 시간을 전체 실행 시간의 3.5 %에서 1.5 %로 줄였습니다. 반면에 Boost 예제는 원래 코드 (13 %)보다 상당히 나빴습니다. – Serge