宽字符串与字符串,它是否会影响Windows C ++中的性能

时间:2013-06-04 19:33:57

标签: c++ performance widestring

我在C ++项目中处理了很多Unicode文件路径。我在我的代码中执行检查,如果它们足够精确以适应多字节字符串,我将其保留为普通字符串(std :: string)变量,否则如果字符串不适合Multibyte我将其用作宽字符串。

我的问题是我是否可以将这些路径完全用作绳索......?它会影响性能,我必须做一些字符串操作,文件打开,创建,重命名和使用wstring删除。所以更确切地说,检查多字节或宽字符串,我想直接使用它作为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]
}

请分享您的想法...

1 个答案:

答案 0 :(得分:1)

在Windows中,尝试尽可能多地使用wchar_t。因为它是Windows中的默认字符表示,所以内核也使用wchar_t作为默认值。所有ANSI API都是UNICODE API的包装器。如果你反汇编ANSI API,你就会知道真相。

另外,如果可能,请使用ATL::CString代替std::(w)string。因为它使用的引用计数和类的大小等于指针大小(32位中的4个字节和64位中的8个字节)。这意味着您可以直接从函数返回ATL::CString而不会降低性能。