VS 2015 std :: char_traits <char16_t>操作

时间:2017-04-16 06:51:16

标签: c++11 visual-studio-2015 wchar-t char16-t char-traits

在我的工作场所,我们在VS 2015(Update 3)编译器升级后将字符串类型(包含国际化字符)从std::wstring更改为std::u16string

由于这个原因,我们看到了很多性能回归,例如this

分析器分析显示,std::u16string的{​​{1}} std::char_traits<char16_t>操作,例如copycomparefindassign是受欢迎程度最高且比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)

那可以吗?这种方法有什么问题吗?

0 个答案:

没有答案