VS 2015 std::char_traits operations At my workplace, we changed string type (which holds internationalized characters) for from std::wstring to std::u16string after VS 2015(Update 3) compiler upgrade. 

Due to this, we are seeing loads of performance regressions such as this.

The profiler analysis reveals that std::u16string's std::char_traits&lt;char16_t&gt; operations such as copy, compare, find and assign are the most hit and are taking longer than std::wstring's std::char_traits&lt;wchar_t&gt; counterparts. 

These std::char_traits&lt;wchar_t&gt; operations are written in terms of std::wmem* and std::char_traits&lt;char16_t&gt; operations are written in terms of for loops. 

If we change these traits operations for char16_t type (or std::u16string) to use our own customized traits, we are seeing performance improvements with performance comparable to std::wstring.

We are planning to write our own custom traits (until MS fixes it for next version of VS) as follows

struct string_custom_traits : public std::char_traits&lt;char16_t&gt;
{
    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)));
    }

 };


Would that be OK? Are there any problems with this approach ?
Nothing in std::char_traits::copy says to return src when count is zero.  Further, we must return a pointer to modifiable char_type, which also precludes returning src.

So I think we should write:

#include &lt;cstring&gt;
#include &lt;string&gt;

struct string_custom_traits : public std::char_traits&lt;char16_t&gt;
{
    static char_type * copy(char_type* dest, const char_type* src, size_t count)
    {
        return (char_type*)std::memcpy(dest, src, count * sizeof *src);
    }

    static char_type *move(char_type* dest, const char_type* src, size_t count)
    {
        return (char_type*)std::memmove(dest, src, count * sizeof *src);
    }
};


I've used the template-provided alias char_type for consistency and in case you want to turn this traits class into a template itself.

Make sure you understand and accept the differences between UCS-2 and UTF-16 if you handle characters outside the BMP.