1) Memory safety is practically zero-cost in languages like C++ or rust if you disable runtime bounds-checking (which the C++ standard library does by default). You don&#x27;t get 100% safety, but it&#x27;s still leaps and bounds better than what the C standard library provide (a foot to shoot yourself in the gun with).<p>You may be that legendary programmer who writes code &quot;without bugs&quot; and everything works correctly on the first run. I don&#x27;t doubt a handful of &quot;real programmers&quot; like that exist. But most of us make mistakes, and we want the compiler to protect us. Just look at the endless stream of memory-related vulnerabilities at CERT. Nearly all of them could have been prevented in a memory-safe language.<p>2) That is a non-issue. All serious standard libraries define operation complexity at the Big O granularity. Sometimes they go even further and the spec (especially in C++&#x27;s case) gurantees some implementation details.<p>Anyway, if you&#x27;re not happy with the proper characteristic of a standard data structure for a certain use, there&#x27;s nothing preventing you from creating your own data structure with your preferred behavior pattern. You can even use an &#x27;unsafe&#x27; override - at least you&#x27;d isolate unsafety to a very small and manageable part of the code that way.<p>3) Again, nothing prevents you from optimizing for special cases. But that are many more programs (e.g. parsers) that deal with short and repetetive strings which can benefit from an implementation that passes them as value-types on the stack (this is essentially which most C++ implementations do).<p>4. I&#x27;m all for a default unicode string type and a separate &quot;raw bytes&quot; type. But the you should either store the string as unicode codepoints (UTF-32) or as UTF-8. UTF-16 is pure evil, since then people tend to assume UTF-16 elements are codepoints and surrogates break spectacularly.