#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;
}
}
大家好,我只是发现每个指针都没有显着位。我读到这种技术用于红黑树算法。
问题是:这个技巧的应用范围如何。
我可以放心地使用,一切都很好吗?
答案 0 :(得分:1)
您必须确保所有分配均匀对齐(至少请参阅Is there any guarantee of alignment of address return by C++'s new operation?以获取有关此点的更多信息。)
当我的分配器在8字节边界上对齐时,我已经使用最后3位做了类似的事情。
您输入的内容似乎没有正确定义,我希望看到方法
getRaw
(可能没用)getBit
,setBit
(最后一位管理)getPtr
,setPtr
(除最后一位管理外)您只提供了获取原始值的方法...