Может хранить несвязанные данные в наименее значимом бите указателя работают надежно?

Позвольте мне сразу сказать, что то, что я знаю, что то, что я собираюсь предложить, является смертным грехом, и что я, вероятно, сожгу в аду программирования даже за учитывая это.

Тем не менее, мне все еще интересно узнать, есть ли какая-либо причина, по которой это не сработает.

Ситуация такова: у меня есть класс умного указателя, который подсчитывает ссылки, который я использую везде. Сейчас он выглядит примерно так (примечание: неполный / упрощенный псевдокод):

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. Это означает, что для каждой ссылки в моей программе будет потрачено 7,875 байтов ОЗУ ... и в моей программе очень много ссылок.

Что ж, похоже, это пустая трата оперативной памяти. Но мне действительно нужна эта дополнительная информация (ладно, пошути надо мной и предположить ради обсуждения, что я действительно делаю). И я заметил, что, поскольку IRefCountable не является классом POD, он (предположительно) всегда будет размещаться на адресе памяти, выровненном по словам. Следовательно, младший бит (_ptr) всегда должен быть равен нулю.

Что заставляет меня задуматься ... есть ли какая-то причина, по которой я не могу выполнить ИЛИ свой один бит логических данных в младший бит указателя , и таким образом уменьшить размер sizeof (Ref) вдвое без ущерба для функциональности? Я должен был бы быть осторожным, чтобы И вывести этот бит перед разыменованием указателя, конечно, что сделало бы разыменование указателя менее эффективным, но это может быть компенсировано тем фактом, что ссылки теперь меньше, и, следовательно, их больше. может сразу поместиться в кэш процессора и т. д.

Разумно ли это? Или я настраиваюсь на мир боли? А если второе, то как именно эта боль постигнет меня? (Обратите внимание, что это код, который должен правильно работать во всех достаточно современных средах рабочего стола, но его не нужно запускать на встроенных машинах, суперкомпьютерах или чем-то подобном экзотическом)

12
задан user7116 13 June 2011 в 15:47
поделиться