我的问题是关于指向奇怪大小的内存块。
假设我有一个struct
声明如下:
typedef struct{
int32 val1 : 29;
int32 val2 : 26;
char val3;
}MyStruct;
让我们假设在结构中声明特定的位字段是可取的(为什么我们使用位字段不是问题)。
如果我想声明一个指向其中一个字段的指针,我可能会尝试这样的事情:
MyStruct test;
int32 *myPtr = &(test.val1);
除非产生错误“不允许使用位字段的地址”。
假设我们想要,有没有办法以这种方式指向这些领域?我知道C ++可能会将字段填充到下一个字节(在本例中为32位)。
答案 0 :(得分:11)
在C ++中,最小可寻址值的大小必须至少为1个字节。所以不,你不能用指针来获取位字段的地址。
C ++ 03标准9.6位字段:
第3段:
......运营商的地址&不应用于位域,因此没有指向位域的指针。 ....
答案 1 :(得分:6)
除此之外产生错误“不允许使用位字段的地址”。
标准明确禁止这一点。请参阅 [class.bit] 9.6 / 3:
运营商地址&不应该应用于位域,因此没有指向位域的指针。
一个字节(CHAR_BIT
位宽,CHAR_BIT
至少为8)是您可以解决的最小值。
假设我们想要,有没有办法以这种方式指向这些字段?
没有。您可以使用指向封闭struct
类型对象的指针。这是C的直接结转;见C FAQ 2.26:
当您还希望能够整体操作某些位集合(可能复制一组标志)时,位字段很不方便。
您可能希望查看其他替代方案,例如std::bitset
或boost::dynamic_bitset
。
答案 2 :(得分:0)
无法获得指向位字段的指针。如果你愿意的话 然而,你自己实现了一个等效的结构,使用移位和 掩码,你应该能够定义一个智能指针。某物 像:
class BitFieldPointer
{
unsigned* myData;
unsigned myMask;
unsigned myShift;
class DereferenceProxy
{
BitFieldPointer const* myOwner;
public:
DereferenceProxy(BitFieldPointer const* owner) : myOwner( owner ) {} operator unsigned() const
{
return (*myOwner->myData && myOwner->myMask) >> myOwner->myShift;
}
void operator=( unsigned new_value ) const
{
*myData = (*myOwner->myData && ~myOwner->myMask) |
((new_value << myOwner->myShift) && myOwner->myMask);
}
};
public:
// ...
DereferenceProxy operator*() const
{
return DereferenceProxy(this);
}
};
(这只是一个粗略的想法。你可能想要一个指针和一个 指向const的指针,以及代理的生命周期与其所有者的生命周期 可能是一个问题。)