在我的工作场所,我们在 VS 2015(更新 3)编译器升级后将std::wstring
字符串类型(包含国际化字符)更改为 from 。std::u16string
由于这个原因,我们看到了大量的性能回归,例如this。
分析器分析表明std::u16string
的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
type (or std::u16string
) 的这些特征操作更改为使用我们自己定制的特征,我们会看到性能改进,性能与std::wstring
.
我们计划编写我们自己的自定义特征(直到 MS 为下一个版本的 VS 修复它)如下
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)));
}
};
这样可以吗?这种方法有什么问题吗?