2013-06-04 70 views
0

我正在處理我的C++項目中的很多Unicode文件路徑。我在我的代碼中執行檢查,如果它們足夠適合Multibyte字符串,我將它保存爲一個普通字符串(std :: string)變量,其他字符串不適合多字節我將它用作寬字符串。寬字符串與字符串,是否影響Windows C++性能

我的問題是我是否可以完全使用路徑作爲wstrings ..?會影響性能,我必須做一些字符串操作,使用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] 
} 

請分享你的想法...

+3

您應該無條件地使用'std :: wstring'並忘記將MBCS存儲在'std :: string'中,否則切換到UTF-8而不是MBCS,因此不存在數據丟失的可能性(MBCS是沒有損失),然後在調用需要UTF-16的API函數時,在UTF-8和UTF-16之間進行轉換。 –

+2

擔心在您擔心速度之前進行更正。堅持一種格式將簡化代碼,並使其更加簡單。 –

+1

我的意見是,你的檢查和轉換功能將遠遠超過在任何地方使用寬字符串。 –

回答

1

在Windows中,嘗試使用wchar_t儘可能更多鈔票。由於它是Windows中的默認字符表示,內核也使用wchar_t作爲默認值。所有ANSI API都是UNICODE API的封裝。如果你反彙編ANSI API,你會知道事實。如果可能的話,使用ATL::CString而不是std::(w)string。因爲其使用的引用計數和類的大小等於指針大小(32位爲4個字節,64位爲8個字節)。這意味着您可以直接從函數返回ATL::CString而不會影響性能。

相關問題