A) 시간을 미리 할당하고, B)의 printf의 비용을 피할 덜 작지만 빠른 버전의 형식을 재-해석 c) printf에 대한 함수 호출 오버 헤드를 피하십시오.
std::wstring wstr(L"\x043d\x043e\x043c\x0430");
std::string sstr;
// Reserve memory in 1 hit to avoid lots of copying for long strings.
static size_t const nchars_per_code = 6;
sstr.reserve(wstr.size() * nchars_per_code);
char code[nchars_per_code];
code[0] = '\\';
code[1] = 'u';
static char const* const hexlut = "abcdef";
std::wstring::const_iterator i = wstr.begin();
std::wstring::const_iterator e = wstr.end();
for (; i != e; ++i) {
unsigned wc = *i;
code[2] = (hexlut[(wc >> 12) & 0xF]);
code[3] = (hexlut[(wc >> 8) & 0xF]);
code[4] = (hexlut[(wc >> 4) & 0xF]);
code[5] = (hexlut[(wc) & 0xF]);
sstr.append(code, code + nchars_per_code);
}
"가장 좋지 않은 것"이라면, 당신이 (a) 그것을 비교하고 (b) 왜 * 사용하지 않는지 물어봐도 될까요? *? – WhozCraig
작은 크기가 아니며 여러 줄의 코드가 필요합니다. 이미 boost 또는 std에 한 줄짜리 변환기가있을 수 있다고 생각합니다. –
표준 라이브러리에는이 변환기가 없으며 부스트가있는 경우에는 6 줄의 구현 코드보다 압축하기가 어려울 것입니다. * 발신자 측 (당신)은 물론 대략 약 5 분의 1의 비율로 상당히 압축 될 것입니다. 그러한 변환기가 존재하면 83 % * 존재합니다. 그런 다음 다시 도입 된 의존성은 확실히 6 줄보다 커야합니다. 좀 더 효율적으로 만들 수 있습니까? 확실히. 약간의 용량을'.reserve() '로 시작하십시오. – WhozCraig