Classes and class hierarchies
C.180
Используйте `union` для экономии памяти
Причина
union позволяет использовать один и тот же участок памяти для объектов разных типов в разное время. Следовательно, его можно применять для экономии памяти, если несколько объектов никогда не используются одновременно.
Пример
union Value {
int x;
double d;
};
Value v = { 123 }; // теперь v хранит int
cout << v.x << '\n'; // выводит 123
v.d = 987.654; // теперь v хранит double
cout << v.d << '\n'; // выводит 987.654
Но помните о предупреждении: Избегайте «голых» union
Пример
// Оптимизация коротких строк
constexpr size_t buffer_size = 16; // Немного больше размера указателя
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:
// Если строка достаточно короткая, храним саму строку,
// а не указатель на неё.
union {
char* string_ptr;
char string_buffer[buffer_size];
};
const size_t size;
};
Контроль
???