This change introduces the __assign_str_noalias_external which is invoked on the slow path from basic_string::operator=(const basic_string&) if either of the strings is a long string..
__string_assign_str_noalias_external is optimized for being called from the operator= method: no alias into this, input has terminating zero as s[n], and size does not exceed max size. The branch in the external instantiated code should be well predicted.
This change explicitly does not change the existing template instantiation for stable, and limits itself to have the new method always externally instantiated. Future changes will include removing operator=(const basic_string&) from the unstable ABI and allowing it to be inlined.