在我的工作场所,我们在VS 2015(Update 3)编译器升级后将字符串类型(包含国际化字符)从std::wstring
更改为std::u16string
。
由于这个原因,我们看到了很多性能回归,例如this。
分析器分析显示,std::u16string
的{{1}} std::char_traits<char16_t>
操作,例如copy
,compare
,find
和assign
是受欢迎程度最高且比std::wstring
std::char_traits<wchar_t>
std::char_traits<wchar_t>
对等人更长。
这些std::wmem*
操作是根据std::char_traits<char16_t>
编写的,for loops
操作是根据char16_t
编写的。
如果我们更改std::u16string
类型(或std::wstring
)的这些特征操作以使用我们自己的自定义特征,我们会看到性能改进,其效果与struct string_custom_traits : public std::char_traits<char16_t>
{
static const char16_t * copy(char16_t* dest, const char16_t* src, size_t count)
{
return (count == 0 ? src : (char16_t*)std::memcpy(dest, src, count * sizeof(char16_t)));
}
};
相当。
我们计划编写自己的自定义特征(直到MS为下一版本的VS修复它),如下所示
sizeof(myarr)
那可以吗?这种方法有什么问题吗?