#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;
}
}
我只是自己发现每个指针都没有有效位。我读到这项技术用于红黑树算法。
这个技巧的适用范围如何?
我可以在哪里放心使用,一切都很好?
您必须确保分配都是均匀对齐的(至少,请参阅 C++ 的新操作是否保证地址返回的对齐?以获取有关这一点的更多信息(。
我已经使用最后 3 位作为当时在 8 字节边界上对齐的分配器做了这样的事情。
您的类型似乎没有正确定义,我想看看方法
- 原始值、CTOR 和
getRaw
(可能无用( - 位值、
getBit
、setBit
(最后一位管理( - 指针值、
getPtr
、setPtr
(除最后一位管理外的所有值(
您只提供了一种获取原始值的方法...