Позвольте мне прямо сказать, что я знаю, что то, что я собираюсь предложить, - это смертельный грех, и что я, вероятно, сгорит в программировании ада, даже если учесть его.
Тем не менее, мне все еще интересно узнать, есть ли причина, почему это не сработает.
Ситуация такова: у меня есть класс интеллектуальных указателей с подсчетом ссылок, который я использую везде. В настоящее время он выглядит примерно так (примечание: неполный/упрощенный psuedocode):
class IRefCountable
{
public:
IRefCountable() : _refCount(0) {}
virtual ~IRefCountable() {}
void Ref() {_refCount++;}
bool Unref() {return (--_refCount==0);}
private:
unsigned int _refCount;
};
class Ref
{
public:
Ref(IRefCountable * ptr, bool isObjectOnHeap) : _ptr(ptr), _isObjectOnHeap(isObjectOnHeap)
{
_ptr->Ref();
}
~Ref()
{
if ((_ptr->Unref())&&(_isObjectOnHeap)) delete _ptr;
}
private:
IRefCountable * _ptr;
bool _isObjectOnHeap;
};
Сегодня я заметил, что sizeof (Ref) = 16. Однако, если я удаляю логическую переменную-член _isObjectOnHeap, sizeof (Ref) уменьшается до 8. Это означает, что для каждого Ref в моей программе есть 7,875 потраченных впустую байтов ОЗУ... и в моей программе много, много Refs.
Ну, это кажется пустой тратой памяти. Но мне действительно нужна эта дополнительная информация (хорошо, юмористируйте меня и принимайте во внимание обсуждение, которое я действительно делаю). И я замечаю, что поскольку IRefCountable является классом, отличным от POD, он (предположительно) всегда будет выделен на адрес памяти с выравниванием по словам. Поэтому наименьший значащий бит (_ptr) всегда должен быть равен нулю.
Что заставляет меня задаться вопросом... есть ли причина, по которой я не могу ИЛИ мой один бит логических данных в наименее значимый бит указателя, и таким образом уменьшить sizeof (Ref) наполовину, не жертвуя какой-либо функциональностью? Я должен был бы быть осторожным с AND из этого бита до разыменования указателя, конечно, что сделало бы ненужные разметки указателя, но это могло бы быть вызвано тем фактом, что Refs теперь меньше, и, следовательно, больше из них может сразу входить в процессорный кеш и т.д.
Это разумная вещь? Или я настраиваю себя на мир боли? И если последнее, как именно было бы больно посещать меня? (Обратите внимание, что это код, который должен работать корректно во всех достаточно современных средах рабочего стола, но его не нужно запускать во встроенных машинах или суперкомпьютерах или что-то подобное экзотическому)