mirror of
https://github.com/isocpp/CppCoreGuidelines.git
synced 2024-03-22 13:30:58 +08:00
Short string optimization example for C.180
Extra blank lines removed strcpy replaced with strcpy_s to get rid of Travis CI warnings Note: strcpy_s is defined in the Annex K of the C++11 standard. Gabriel's comments incorporated - No need for braces for a single statement. - Comment to explain why buffer_size is 16. Bracing style made consistent with the rest of the examples Bracing style made consistent with the rest of the examples braces made consistent with the rest of the examples
This commit is contained in:
parent
798177568e
commit
52c4376433
|
@ -7322,7 +7322,44 @@ But heed the warning: [Avoid "naked" `union`s](#Ru-naked)
|
||||||
|
|
||||||
##### Example
|
##### 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
|
##### Enforcement
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user