Некоторая версия строки не использует динамическую память для строки, когда строка мала.Таким образом, храните строку внутри строкового объекта.
Подумайте об этом:
struct SimpleString
{
char* begin; // beginning of string
char* end; // end of string
char* allocEnd; // end of allocated buffer end <= allocEnd
int* shareCount; // String are usually copy on write
// as a result you need to track the number of people
// using this buffer
};
Теперь в 64-битной системе.Каждый указатель составляет 8 байтов.Таким образом, строка размером менее 32 байт может вписаться в одну и ту же структуру без выделения буфера.
struct CompressedString
{
char buffer[sizeof(SimpleString)];
};
stuct OptString
{
int type; // Normal /Compressed
union
{
SimpleString simple;
CompressedString compressed;
}
};
Так что, как я полагаю, происходит выше.
Для этого используется очень эффективная реализация строкипозволяя вам выгружать объект в файл, не беспокоясь об указателях (так как std :: string не использует указатели).
Очевидно, что это не переносимо, поскольку это зависит от деталей реализации std :: string.
Такой интересный трюк, но не переносимый (и может легко сломаться без некоторых проверок времени компиляции).