5

私の質問は、奇妙なサイズのメモリのチャンクを指すことです。

struct次のように宣言したとしましょう:

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

構造体で特定のビット フィールドを宣言することが望ましいと仮定しましょう (ビット フィールドを使用する理由は問題ではありません)。

これらのフィールドの 1 つを指すポインターを宣言したい場合は、次のようにします。

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

これが「ビットフィールドのアドレスを取得することは許可されていません」というエラーを生成することを除いて。

私たちが望むと仮定すると、この方法でそれらのフィールドを指す方法はありますか? C++ はおそらくフィールドを次のバイト (この場合は 32 ビット) にパディングすることを知っています。

4

3 に答える 3

12

C++ では、アドレス指定可能な最小値のサイズは少なくとも 1 バイトである必要があります。したがって、ポインターを使用してビットフィールドのアドレスを取得することはできません。

C++03 標準 9.6 ビットフィールド:
パラ 3:

... アドレス演算子 & はビットフィールドには適用されないため、ビットフィールドへのポインターはありません。....

于 2012-06-19T12:02:34.663 に答える
6

これが「ビットフィールドのアドレスを取得することは許可されていません」というエラーを生成することを除いて。

これは、標準では明示的に許可されていません。[class.bit] 9.6/3を参照してください。

アドレス演算子&はビットフィールドに適用されないため、ビットフィールドへのポインタはありません。

1バイト(CHAR_BITビット幅、CHAR_BIT少なくとも8)は、アドレス指定できる最小値です。

私たちが望むと仮定して、このようにそれらのフィールドを指す方法はありますか?

structいいえ。ただし、囲んでいるタイプのオブジェクトへのポインタを持つことはできます。これはCからの直接の持ち越しです。CFAQ2.26を参照してください。

ビットフィールドは、ビットのコレクション全体を操作できるようにしたい場合(おそらくフラグのセットをコピーする場合)には不便です。

std::bitsetまたはなどの他の代替案を検討することをお勧めしますboost::dynamic_bitset

于 2012-06-19T12:14:54.220 に答える
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 へのポインターとポインターの両方が必要であり、プロキシの寿命とその所有者の寿命が問題になる可能性があります。)

于 2012-06-19T12:44:04.303 に答える