2016-12-07 1 views
1
#include <sstream> 

using namespace std; 

const char* GetHugeString(); 

int main() 
{ 
    const char* p = GetHugeString(); 

    // 
    // Below will copy the huge string into a std::string object! 
    // 
    istringstream sstrm{p}; 

    return {}; 
} 

istringstream 거대한 문자열의 사본이 필요하지 않습니다. null로 끝나는 문자열 포인터이면 충분합니다. 그러나 istringstreamctorstd::string_view (C++ 1z 만 해당) 대신 인수가 std::string입니다.istringstream을보다 효율적으로 만드는 방법은 무엇입니까?

그런 경우에 std::istringstream을 더 효율적으로 만들 수있는 해결 방법이 있습니까?

+0

이것이 이유인지는 모르겠지만 내부 저장소가 'stringbuf'에 의해 뒷받침 되었기 때문에 지원되지 않는다고 생각됩니다. 이유는 '문자열 _보기'를 허용하지 않기 때문입니다. –

답변

2

당신은 단순히 istringstream에서 내부적으로 사용되는 버퍼를 할당 할 수

istringstream stream; 
stream.rdbuf()->pubsetbuf(p, strlen(p)); 

이 문자열을 복사하지 않습니다. pubsetbuf()char*이 아니며 const char*이 아니라 실제로 문자열을 수정하지 않으므로 전달하기 전에 const_cast C 문자열 포인터가 될 수 있습니다.

+2

[구현 정의 동작] (http://stackoverflow.com/a/13059195/636019). – ildjarn

관련 문제