重複の可能性:
C++ の列挙型データのサイズは?
enum データ型はどのように内部に保存されますか (8/16/32 ビットの int だと思いますか?)、安全にシリアル化できますか、それとも quint8 のようなものを使用して値を保存する必要がありますか? つまりsizeof(MyEnum)
、すべてのプラットフォームで同じサイズであることが保証されていますか?
重複の可能性:
C++ の列挙型データのサイズは?
enum データ型はどのように内部に保存されますか (8/16/32 ビットの int だと思いますか?)、安全にシリアル化できますか、それとも quint8 のようなものを使用して値を保存する必要がありますか? つまりsizeof(MyEnum)
、すべてのプラットフォームで同じサイズであることが保証されていますか?
つまり、 sizeof(MyEnum) はすべてのプラットフォームで同じサイズであることが保証されていますか?
C++11 では明示的な型を設定できます (ただし、以前の C++ 化身ではできません) 。
enum class Drug : char {
Cocaine,
Cannabis,
Crack
};
また
enum Sex : uint32_t {
Male,
Female,
Other
};
class
in before the way を使用すると、ユーザーはそれを綴ることをenum
強制されます。宣言の前に in がない列挙の場合、綴りはオプションです (との両方が有効です)。Drug
Drug::Cocaine
class
Sex::Male
Female
2011 年より前の C++ のハックには、最小サイズを強制する次のものが含まれます。
enum Frob {
...
FORCE_DWORD = 0x7fffffff
};
ReactOS のDirectX-SDK 実装などで実際に見られます。
7.2 列挙宣言 [dcl.enum]
[...]
§6: 基になる型が固定されていない列挙の場合、基になる型は、列挙で定義されたすべての列挙子の値を表すことができる整数型です。すべての列挙子の値を表すことができる整数型がない場合、列挙は不適切な形式です。 列挙子の値が int または unsigned int に収まらない場合を除き、基になる型が int より大きくならないことを除いて、どの整数型が基になる型として使用されるかは実装定義です。enumerator-list が空の場合、基になる型は、列挙に値 0 の単一の列挙子があるかのようになります。
絶対にありません。列挙型の多くの特性は実装定義です。実際の (安全な) 型を選択し、それをシリアル化してください。
enum のサイズは と同じint
であるため、どこでも同じ長さであるとは限りません。
、、 などstdint.h
で定義されているタイプのいずれかを使用します。int32_t
int16_t
通常、サイズが異なる int と同じになります。この回答を参照してください。