<ctype.h> / <cctype>)int toupper(int c)、int tolower(int c):單字符轉換,受當前 locale 影響。int toupper_l(int c, locale_t loc) 等 _l 版本:指定 locale。towupper、towlower(效率極低,不推薦)。<string.h> / <cstring>)errno_t _strlwr_s(char* str, size_t n)、_strupr_s:原地轉換整個以空字符結尾的字符串,帶緩衝區長度檢查。_wcslwr_s、_wcsupr_s。_strlwr_s(arr) 自動推導數組大小。<windows.h>)CharUpper/CharLower(LPTSTR):原地轉換字符串。CharUpperBuff/CharLowerBuff(LPTSTR, DWORD):指定長度轉換。CharUpperA、CharUpperW。<algorithm>)transform(s.begin(), s.end(), s.begin(), ::toupper); // 全大寫 transform(s.begin(), s.end(), s.begin(), ::tolower); // 全小寫
::toupper 簽名匹配(接受 int 返回 int,隱式轉換)。inline char toUpperAscii(char c) {
return (c >= 'a' && c <= 'z') ? (c & 0xDF) : c; // 0xDF = 0b11011111
}
inline char toLowerAscii(char c) {
return (c >= 'A' && c <= 'Z') ? (c | 0x20) : c; // 0x20 = 0b00100000
}
inline wchar_t toUpperAscii(wchar_t c) {
return (c >= L'a' && c <= L'z') ? (c & 0x00DF) : c;
}
inline wchar_t toLowerAscii(wchar_t c) {
return (c >= L'A' && c <= L'Z') ? (c | 0x0020) : c;
}
// 整串轉換
void strToUpper(char* s) { for (; *s; ++s) *s = toUpperAscii(*s); }
void strToLower(char* s) { for (; *s; ++s) *s = toLowerAscii(*s); }
| 方法 | 耗時 (ms) | 相對速度 |
|---|---|---|
| 直接位運算(不判斷範圍) | ~1077 | 1.00x (基準) |
| 手寫帶範圍判斷 | ~3666 | 3.4x |
| STL transform + 自定義函數 | ~3292 | 3.1x |
| C 庫 toupper/tolower | ~6193 | 5.7x |
| C++ 庫 _strupr_s/_strlwr_s | ~5912 | 5.5x |
| STL transform + ::toupper | ~6146 | 5.7x |
| Windows API CharUpperBuff | ~13884 | 12.9x |
c & 0xDF / c | 0x20),最快。towupper_l 配合 locale。std::transform + ::toupper。某項目中 URL 歸一化(轉小寫)佔用大量 CPU。將 std::transform(::tolower) 替換為手寫 toLowerAscii 循環,性能提升 60%,延遲從毫秒級降至微秒級。