2

重複の可能性:
C++ の列挙型データのサイズは?

enum データ型はどのように内部に保存されますか (8/16/32 ビットの int だと思いますか?)、安全にシリアル化できますか、それとも quint8 のようなものを使用して値を保存する必要がありますか? つまりsizeof(MyEnum)、すべてのプラットフォームで同じサイズであることが保証されていますか?

4

4 に答える 4

9

つまり、 sizeof(MyEnum) はすべてのプラットフォームで同じサイズであることが保証されていますか?

C++11 では明示的な型を設定できます (ただし、以前の C++ 化身ではできません)

enum class Drug : char {
    Cocaine,
    Cannabis,
    Crack
};

また

enum Sex : uint32_t {
    Male,
    Female,
    Other
};

classin before the way を使用すると、ユーザーはそれを綴ることをenum強制されます。宣言の前に in がない列挙の場合、綴りはオプションです (との両方が有効です)。DrugDrug::CocaineclassSex::MaleFemale

2011 年より前の C++ のハックには、最小サイズを強制する次のものが含まれます。

enum Frob {
    ...
    FORCE_DWORD          = 0x7fffffff
};

ReactOS のDirectX-SDK 実装などで実際に見られます。


基準の参照

7.2 列挙宣言 [dcl.enum]

[...]

§6: 基になる型が固定されていない列挙の場合、基になる型は、列挙で定義されたすべての列挙子の値を表すことができる整数型です。すべての列挙子の値を表すことができる整数型がない場合、列挙は不適切な形式です。 列挙子の値が int または unsigned int に収まらない場合を除き、基になる型が int より大きくならないことを除いて、どの整数型が基になる型として使用されるかは実装定義です。enumerator-list が空の場合、基になる型は、列挙に値 0 の単一の列挙子があるかのようになります。

于 2012-12-21T15:36:08.093 に答える
3

絶対にありません。列挙型の多くの特性は実装定義です。実際の (安全な) 型を選択し、それをシリアル化してください。

于 2012-12-21T15:36:07.090 に答える
1

enum のサイズは と同じintであるため、どこでも同じ長さであるとは限りません。

、、 などstdint.hで定義されているタイプのいずれかを使用します。int32_tint16_t

于 2012-12-21T15:36:25.000 に答える
0

通常、サイズが異なる int と同じになります。この回答を参照してください。

于 2012-12-21T15:36:20.260 に答える