特定位大小的C ++指针

时间:2012-06-19 11:59:17

标签: c++ pointers struct bit-fields

我的问题是关于指向奇怪大小的内存块。

假设我有一个struct声明如下:

typedef struct{
   int32 val1  : 29; 
   int32 val2  : 26;
   char  val3;
}MyStruct;

让我们假设在结构中声明特定的位字段是可取的(为什么我们使用位字段不是问题)。

如果我想声明一个指向其中一个字段的指针,我可能会尝试这样的事情:

MyStruct test;
int32 *myPtr = &(test.val1);

除非产生错误“不允许使用位字段的地址”。

假设我们想要,有没有办法以这种方式指向这些领域?我知道C ++可能会将字段填充到下一个字节(在本例中为32位)。

3 个答案:

答案 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::bitsetboost::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的指针,以及代理的生命周期与其所有者的生命周期 可能是一个问题。)