3

型の安全性を維持しながら、列挙型を 1 バイト未満に定義したいと思います。

列挙型を次のように定義します。

enum MyEnum : unsigned char
{
    i ,j, k, w
};

1 バイトに縮小することはできますが、最大で 4 つの値を使用するため、2 ビットのみを使用するようにしたいと考えています。これはできますか?

列挙型を使用する構造体では、次は機能しません

struct MyStruct
{
    MyEnum mEnum : 2; // This will be 4 bytes in size
};

ありがとう!

アップデート:

質問は次のシナリオから来ています。

enum MyEnum : unsigned char
{
    i ,j, k, w
};

struct MyStruct
{
    union
    {
        signed int mXa:3;
        unsigned int mXb:3;
    };

    union
    {
        signed int mYa:3;
        unsigned int mYb:3;
    };

    MyEnum mEnum:2;
};

sizeof(MyStruct) は 9 バイトを示しています。理想的には、構造体のサイズを 1 バイトにしたいと思います。

実装されたソリューションの更新:

この構造体は 1 バイトで、同じ機能とタイプ セーフを提供します。

enum MyEnum :unsigned char
{
   i,j,k,w
};

struct MyStruct
{
   union
   {
      struct { MyEnum mEnum:2; char mXa:3; char mXb:3;};
      struct { MyEnum mEnum:2; unsigned char mYa:3; unsigned char mYb:3;};
   }; 
};
4

4 に答える 4

5

標準定義によると、タイプsizeofは少なくとも 1 バイトである必要があります。これは、メモリのアドレス指定可能な最小単位です。

あなたが言及しているビットフィールドの機能により、構造体のメンバーをより小さなサイズに定義できますが、構造体自体はそうではない可能性があります

  • それも少なくとも1バイトでなければなりません
  • アライメントの考慮事項により、さらに大きくする必要がある場合があります

さらに、上記のように、バイトはメモリのアドレス指定可能な最小単位であるため、ビットフィールドメンバーのアドレスを取得することはできません (sizeof実際にビットではなくバイト数を返すことで、ビットより少ないと予想した場合はCHAR_BITsizeofそれを表現することさえできないでしょう)。

于 2013-06-11T21:02:43.183 に答える
1

いいえ。C++ では、"char" がプラットフォームでアドレス指定可能なメモリの最小単位であると定義されています。2 ビットをアドレス指定することはできません。

于 2013-06-11T21:01:25.837 に答える
1

ビットフィールドは、同じ基になる型を使用する場合にのみスペースを共有できます。そして、未使用のビットは実際には未使用のままです。ビットフィールドのビットの合計が 3 ビットの場合でも、合計unsigned int4 バイトが必要です。両方の列挙型にメンバーがあるため、どちらも 4 バイトですが、ビットフィールドであるため、アライメントは 1 です。したがって、最初は 4 バイト、2 番目は 4 バイト、次には 1 バイトです。これらはすべてアライメントが 1 であるため、パディングは必要ありません。unsigned intenumMyEnum

残念ながら、union実際にはビットフィールドではまったく機能しません。ビットフィールドは整数型専用です。深刻な再設計なしでデータを取得できるのは、最大で 3 バイトです

enum MyEnum : unsigned char
{
    i ,j, k, w
};

union MyUnion
{
    signed char ma:3; //char to save memory
    unsigned char mb:3;
};

struct MyStruct
{
    MyUnion X;
    MyUnion Y; 
    MyEnum mEnum;
}; //this structure is three bytes

完全な再設計のカテゴリには、次のものがあります

于 2013-06-11T21:30:20.513 に答える
0

ビット パッキング 'Works for me'

#include <iostream>

enum MyEnum : unsigned char
{
    i ,j, k, w
};
struct MyStruct
{
    MyEnum mEnum : 2;
    unsigned char val : 6;
};

int main()
{
    std::cout << sizeof(MyStruct);
}

プリントアウト 1. どのように/何を測定していますか?

編集:ライブリンク

構造体の次のものとしてポインターを持っているようなことをしていますか? その場合、ポインタはほとんどの 32 ビット システムで 4 バイト アラインされている必要があるため、30 ビットのデッド スペースができます。

編集:あなたの更新された例では、あなたを壊している組合です

enum MyEnum : unsigned char
{
    i ,j, k, w
};


struct MyStruct
{
    unsigned char mXb:3;
    unsigned char mYb:3;

    MyEnum mEnum:2;
};

サイズは 1 です。ただし、ユニオンとビット パッキングがどのように連携するかはわかりません。

于 2013-06-11T21:00:27.230 に答える