This change splits the copy constructor up inlining short initialization, and explicitly outlining long initialization into __init_copy_ctor_external() which is the externally instantiated slow path.
For unstable ABI, this has the following changes:
- remove basic_string(const basic_string&)
- remove basic_string(const basic_string&, const Allocator&)
- add __init_copy_ctor_external(const value_type*, size_type)
Quick local benchmark for Copy:
Master
--------------------------------------------------------------- Benchmark Time CPU Iterations --------------------------------------------------------------- BM_StringCopy_Empty 3.50 ns 3.51 ns 199326720 BM_StringCopy_Small 3.50 ns 3.51 ns 199510016 BM_StringCopy_Large 15.7 ns 15.7 ns 45230080 BM_StringCopy_Huge 1503 ns 1503 ns 464896
With this change
--------------------------------------------------------------- Benchmark Time CPU Iterations --------------------------------------------------------------- BM_StringCopy_Empty 1.99 ns 2.00 ns 356471808 BM_StringCopy_Small 3.29 ns 3.30 ns 203425792 BM_StringCopy_Large 13.3 ns 13.3 ns 52948992 BM_StringCopy_Huge 1472 ns 1472 ns 475136
This isn't always externally instantiated.
And it doesn't assert that __s is null terminated (nor can it)
What's this comment really trying to say?