2013-06-04 6 views
0

내 C++ 프로젝트에서 많은 유니 코드 파일 경로를 처리하고 있습니다. 나는 내 코드에서 체크를 수행한다. Multibyte String에 맞을만큼 충분히 괜찮 으면, 나는 보통 문자열 (std :: string) 변수로 유지한다. 문자열이 Multibyte에 맞지 않으면, 와이드 char 문자열.넓은 문자열 대 문자열, Windows C++의 성능에 영향을 줍니까

내 질문은 내가 wstrings ..로 완전히 경로를 사용할 수 있는지 여부입니다? 그것은 성능에 영향을 미칠 것인가, 나는 문자열 조작을해야하고, 파일을 열고, 만들고, 이름을 변경하고, wstring을 삭제해야한다. 그래서 오히려 그 멀티 바이트 또는 넓은 char 문자열을 검사, 나는 그것을 많이 wstring로 사용하고 싶습니다 if/else.

bool IsUnicodeWString(const std::wstring &_WStr) 
{ 
    WCHAR* posUnicodePath = (WCHAR*)_WStr.c_str(); 
    size_t multiByteLen = wcstombs(NULL, posUnicodePath, 0) + 1; 
    int tempLength = 0; 
    if (multiByteLen > 0) 
    { 
    TCHAR* _tmpTChar = new TCHAR[multiByteLen + 1]; 
    memset(_tmpTChar, '\0', multiByteLen + 1); 
    tempLength = wcstombs(_tmpTChar, posUnicodePath, multiByteLen); 
    if (tempLength == std::string::npos) 
    { 
     multiByteLen = 0; 
    } 
    delete[] _tmpTChar; 
    } 
    if(multiByteLen == 0 || multiByteLen == std::string::npos) { // Is Unicode file 
    return true; 
    } 
    else{ 
    return false; 
    } 
} 

if(IsUnicodeWString) { 
     // Use wstring [ Operations - String Manipulations,FilePath used for Open,Read,Write,Create,Delete,Rename,etc] 
} else { 
     //string [ Operations - String Manipulations,FilePath used for Open,Read,Write,Create,Delete,Rename,etc] 
} 

의견을 공유하세요 ... 윈도우에서

+3

무조건'std :: wstring '을 사용하고 MBCS를'std :: string'에 모두 저장하는 것을 잊어 버리거나 MBCS 대신 UTF-8로 전환하여 데이터 손실 가능성을 없애야합니다 (MBCS는 손실없이) UTF-16을 필요로하는 API 함수를 호출 할 때 UTF-8과 UTF-16간에 변환 할 수 있습니다. –

+2

속도에 대해 걱정하기 전에 문제를 수정하는 것에 대해 걱정할 필요가 있습니다. 하나의 형식을 고수하면 코드가 단순 해지며이를 수정하면 훨씬 간단 해집니다. –

+1

제 생각에 당신의 점검과 변환 기능은 어디에서나 넓은 문자열을 사용하는 것보다 훨씬 비쌉니다. –

답변

1

, 추적 할 수없는 가망만큼 wchar_t를 사용해보십시오. Windows에서 기본 문자 표현이기 때문에 커널도 기본값으로 wchar_t을 사용합니다. 모든 ANSI API는 UNICODE API의 래퍼입니다. ANSI API를 분해하면 진실을 알게됩니다.

또한 가능하면 std::(w)stringATL::CString으로 사용하십시오. 사용 된 참조 카운팅과 클래스의 크기가 포인터 크기 (32 비트의 경우 4 바이트, 64 비트의 경우 8 바이트)와 동일하기 때문입니다. 즉, 성능 저하없이 함수에서 직접 ATL::CString을 반환 할 수 있습니다.