たとえば、2つのケースを持つEnumがある場合、ブール値よりも多くのメモリが必要になりますか?言語:Java、C++
Javaでは、 enum
は本格的なクラスです :
Javaプログラミング言語の列挙型は、他の言語の列挙型よりもはるかに強力です。 enum宣言はクラス(enum型と呼ばれる)を定義します。列挙型クラスの本体には、メソッドやその他のフィールドを含めることができます。
各enum
の実際のサイズを確認するために、実際のenum
を作成し、作成したclass
ファイルの内容を調べてみましょう。
次のConstants
列挙型クラスがあるとします。
_public enum Constants {
ONE,
TWO,
THREE;
}
_
上記のenum
をコンパイルし、結果のclass
ファイルをjavap
で逆アセンブルすると、次のようになります。
_Compiled from "Constants.Java"
public final class Constants extends Java.lang.Enum{
public static final Constants ONE;
public static final Constants TWO;
public static final Constants THREE;
public static Constants[] values();
public static Constants valueOf(Java.lang.String);
static {};
}
_
逆アセンブリは、enum
の各フィールドがConstants
enum
クラスのインスタンスであることを示しています。 (javap
を使用してさらに分析すると、静的初期化ブロックでnew Constants(String)
コンストラクターを呼び出して新しいオブジェクトを作成することにより、各フィールドが初期化されていることがわかります。)
したがって、作成する各enum
フィールドは、JVMでオブジェクトを作成するオーバーヘッドと少なくとも同じであることを認識できます。
Javaでは、メモリ内の列挙型の各値のインスタンスは1つだけです。列挙型への参照には、その参照用のストレージのみが必要です。列挙型の値のチェックは、他の参照比較と同じくらい効率的です。
これを心配するのは、大量の列挙型を格納するときだけです。 Javaの場合、EnumSetを使用できる場合があります。内部ではビットベクトルを使用しており、スペース効率が高く高速です。
http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/EnumSet.html
bool
は1バイトとして実装される可能性がありますが、通常、構造体では、ブール値がint
。
最近のプロセッサは、メインメモリからキャッシュライン全体(64バイト)としてデータをロードします。 L1キャッシュからの1バイトのロードと4バイトのロードの違いはごくわずかです。
非常に高性能なアプリケーションでキャッシュラインを最適化しようとしている場合は、列挙型の大きさを気にするかもしれませんが、一般的に、ブール値を使用するよりも列挙型を定義する方が明確です。
Javaでは、より多くのメモリが必要になります。 C++では、同じ型の定数に必要とされるよりもメモリを必要としません(コンパイル時に評価され、実行時に残りの重要性はありません)。 C++では、これは列挙型のデフォルトの型がintと同じスペースを占めることを意味します。
ISO C++では、列挙型がその最大の列挙子が必要とするよりも大きくなる義務はありません。特に、列挙型{TRUE、FALSE}は、sizeof(bool)== sizeof(int)の場合でも、sizeof(1)を持つ場合があります。要件はありません。一部のコンパイラは、列挙型をintと同じサイズにします。これはコンパイラーの機能です。これは、標準で最低限の義務を課しているため許可されています。他のコンパイラは、拡張機能を使用して列挙型のサイズを制御します。
C++では、列挙型は通常、int
と同じサイズです。とはいえ、列挙型のサイズを、定義された値の範囲に適合する最小サイズに設定できるようにするために、コンパイラーがコマンドラインスイッチを提供することは珍しくありません。
printf("%d", sizeof(enum));
sizeof(enum)は、enumにあるものに依存します。私は最近、デフォルトのコンストラクターparamsでArrayList()のサイズを見つけようとしましたが、内部にオブジェクトが保存されていません(つまり、保存する容量は10です)。 ArrayListは100バイト未満ではありません。
したがって、非常に単純な列挙型のsizeof(enum)は10バイト未満である必要があります。小さなプログラムを書いて、ある程度のメモリを与えてから、列挙型を割り当ててみてください。あなたはそれを理解できるはずです(それが私がArrayListのメモリを見つけた方法です)
BR、
〜A
いいえ、列挙型は一般的にintと同じサイズで、ブール値と同じです。
Enumに2つのケースしかない場合、Javaでは、実際には代わりにブール値を使用する方がよいでしょう(メモリサイズ、パフォーマンス、使用法/ロジック)。
メモリコストについて疑問がある場合は、それらの多くを使用することを計画している可能性があります。 Javaでは、BitSetクラスを使用できます。または、小規模では、両方の言語でビット単位の操作でビットを操作できます。
C/C++では、列挙型はintと同じサイズになります。
Gccを使用すると、列挙定義にattribute((packed))を追加して、フットプリントを最小にすることができます。 enumの最大値が256未満の場合は1バイトになり、最大値が65536未満の場合は2バイトになります。
typedef enum {
MY_ENUM0,
MY_ENUM1,
MY_ENUM2,
MY_ENUM3,
MY_ENUM4,
MY_ENUM5
} __attribute__((packed)) myEnum_e;