使用最小的指针位

时间:2015-12-01 16:17:29

标签: c++

#include <iostream>
#include <vector>
using namespace std;


class Foo
{
};
template <typename T>
class SecretPointer
{
    T* m_pointer;
public:
    SecretPointer(T* obj) : m_pointer(obj)
    {
    }
    T* getPtr() const
    {
        return m_pointer;
    }
    void setPointerBit(const bool value)
    {
        if(value)
            m_pointer = (T*)((int)m_pointer | value);
        else
            m_pointer = (T*)((int)m_pointer & ~1);
    }
    bool getPointerBit()
    {
        return ((int)m_pointer & 1);
    }
};


int main()
{
    std::vector<SecretPointer<Foo>> arr;

    SecretPointer<Foo> ptr = new Foo();
    ptr.setPointerBit(true);
    bool isT = ptr.getPointerBit();



    arr.push_back(new Foo());
    arr.push_back(new Foo());
    arr.push_back(new Foo());
    arr.push_back(ptr);
    arr.push_back(new Foo());


    for(auto& it : arr)
    {
        cout << "Secret values: " << it.getPointerBit() << " sizeof : " << sizeof(it) << endl;
    }

}

大家好,我只是发现每个指针都没有显着位。我读到这种技术用于红黑树算法。

问题是:这个技巧的应用范围如何。

我可以放心地使用,一切都很好吗?

1 个答案:

答案 0 :(得分:1)

您必须确保所有分配均匀对齐(至少请参阅Is there any guarantee of alignment of address return by C++'s new operation?以获取有关此点的更多信息。)

当我的分配器在8字节边界上对齐时,我已经使用最后3位做了类似的事情。

您输入的内容似乎没有正确定义,我希望看到方法

  1. 原始值,ctor和getRaw(可能没用)
  2. 位值,getBitsetBit(最后一位管理)
  3. 指针值,getPtrsetPtr(除最后一位管理外)
  4. 您只提供了获取原始值的方法...