diff --git a/CppCoreGuidelines.md b/CppCoreGuidelines.md index 8e9f645..8e1a96b 100644 --- a/CppCoreGuidelines.md +++ b/CppCoreGuidelines.md @@ -7322,7 +7322,44 @@ But heed the warning: [Avoid "naked" `union`s](#Ru-naked) ##### Example - ??? short-string optimization; safe union without dscriminant ??? + // Short string optimization + + constexpr size_t buffer_size = 16; // Slightly larger than the size of a pointer + + class Immutable_string { + public: + Immutable_string(const char* str) : + size(strlen(str)) + { + if (size < buffer_size) + strcpy_s(string_buffer, buffer_size, str); + else { + string_ptr = new char[size + 1]; + strcpy_s(string_ptr, size + 1, str); + } + } + + ~Immutable_string() + { + if (size >= buffer_size) + delete string_ptr; + } + + const char* get_str() const + { + return (size < buffer_size) ? string_buffer : string_ptr; + } + + private: + // If the string is short enough, we store the string itself + // instead of a pointer to the string. + union { + char* string_ptr; + char string_buffer[buffer_size]; + }; + + const size_t size; + }; ##### Enforcement