可以在指针的最低有效位中存储无关数据吗?
|
让我先说一下,我知道我将要提出的是一种致命的罪过,即使考虑到这一点,我也可能会在《编程地狱》中燃烧。
就是说,我仍然有兴趣知道是否有任何理由无法解决该问题。
情况是:我有一个引用计数智能指针类,该类在任何地方都可以使用。当前看起来像这样(注意:不完整/简化的伪代码):
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个RAM字节...而且我的程序中有很多很多Ref。 。
好吧,这似乎在浪费一些RAM。但是,我确实需要更多信息(好吧,使我幽默,并为讨论而做我确实会做的事情)。而且我注意到,由于IRefCountable是非POD类,因此(大概)它将始终分配在字对齐的内存地址上。因此,(_ ptr)的最低有效位应始终为零。
这让我感到奇怪...为什么没有任何理由不能将我的一小部分布尔数据放入指针的最低有效位,从而在不牺牲任何功能的情况下将sizeof(Ref)减半?当然,在取消对指针的引用之前,我必须小心将其与AND删除,这会使指针的引用效率降低,但是这可以通过以下事实来弥补:Ref现在更小,因此更多它们可以立即放入处理器的缓存中,依此类推。
这是合理的做法吗?还是我要为受伤的世界做好准备?如果是后者,那将如何伤害到我身上呢? (请注意,这是需要在所有相当现代的桌面环境中正确运行的代码,但不需要在嵌入式计算机或超级计算机或类似的任何异类中运行)
没有找到相关结果
已邀请:
5 个回复
芭隘的盘石
撵穆
是8而不是16。如果您使用单元测试,请在两个版本中都运行它们。
外镶受继
的转换并返回到相同类型将产生原始指针。 我想您可能会争辩说,如果您可以找回原始的
(带遮罩),那么您可以得到原始的指针。我不知道这种推理有多扎实。 [编辑:仔细考虑,不能保证对齐的指针在转换为整数类型时可以采用任何特殊形式,例如一个没有设置一些位。可能在这里太多了]
橙绥
变量,我建议使用一个简单的构造函数,
从代码中,我闻到只有当对象在堆上时才需要引用计数。对于自动对象,只需将
传递给
,然后在构造函数/析构函数中放入适当的null检查。
抚驰