web-dev-qa-db-ja.com

Enumはどのくらいのメモリを必要としますか?

たとえば、2つのケースを持つEnumがある場合、ブール値よりも多くのメモリが必要になりますか?言語:Java、C++

47
Jelo

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の各フィールドがConstantsenumクラスのインスタンスであることを示しています。 (javapを使用してさらに分析すると、静的初期化ブロックでnew Constants(String)コンストラクターを呼び出して新しいオブジェクトを作成することにより、各フィールドが初期化されていることがわかります。)

したがって、作成する各enumフィールドは、JVMでオブジェクトを作成するオーバーヘッドと少なくとも同じであることを認識できます。

44
coobird

Javaでは、メモリ内の列挙型の各値のインスタンスは1つだけです。列挙型への参照には、その参照用のストレージのみが必要です。列挙型の値のチェックは、他の参照比較と同じくらい効率的です。

17
thenickdude

これを心配するのは、大量の列挙型を格納するときだけです。 Javaの場合、EnumSetを使用できる場合があります。内部ではビットベクトルを使用しており、スペース効率が高く高速です。

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/EnumSet.html

8
Tom

boolは1バイトとして実装される可能性がありますが、通常、構造体では、ブール値がint

最近のプロセッサは、メインメモリからキャッシュライン全体(64バイト)としてデータをロードします。 L1キャッシュからの1バイトのロードと4バイトのロードの違いはごくわずかです。

非常に高性能なアプリケーションでキャッシュラインを最適化しようとしている場合は、列挙型の大きさを気にするかもしれませんが、一般的に、ブール値を使用するよりも列挙型を定義する方が明確です。

7
Mike Dimmick

Javaでは、より多くのメモリが必要になります。 C++では、同じ型の定数に必要とされるよりもメモリを必要としません(コンパイル時に評価され、実行時に残りの重要性はありません)。 C++では、これは列挙型のデフォルトの型がintと同じスペースを占めることを意味します。

4
Jeff Hubbard

ISO C++では、列挙型がその最大の列挙子が必要とするよりも大きくなる義務はありません。特に、列挙型{TRUE、FALSE}は、sizeof(bool)== sizeof(int)の場合でも、sizeof(1)を持つ場合があります。要件はありません。一部のコンパイラは、列挙型をintと同じサイズにします。これはコンパイラーの機能です。これは、標準で最低限の義務を課しているため許可されています。他のコンパイラは、拡張機能を使用して列挙型のサイズを制御します。

3
MSalters

C++では、列挙型は通常、intと同じサイズです。とはいえ、列挙型のサイズを、定義された値の範囲に適合する最小サイズに設定できるようにするために、コンパイラーがコマンドラインスイッチを提供することは珍しくありません。

1
printf("%d", sizeof(enum));
1
Patrick

sizeof(enum)は、enumにあるものに依存します。私は最近、デフォルトのコンストラクターparamsでArrayList()のサイズを見つけようとしましたが、内部にオブジェクトが保存されていません(つまり、保存する容量は10です)。 ArrayListは100バイト未満ではありません。

したがって、非常に単純な列挙型のsizeof(enum)は10バイト未満である必要があります。小さなプログラムを書いて、ある程度のメモリを与えてから、列挙型を割り当ててみてください。あなたはそれを理解できるはずです(それが私がArrayListのメモリを見つけた方法です)

BR、
〜A

0
anjanb

いいえ、列挙型は一般的にintと同じサイズで、ブール値と同じです。

0
Cody Brocious

Enumに2つのケースしかない場合、Javaでは、実際には代わりにブール値を使用する方がよいでしょう(メモリサイズ、パフォーマンス、使用法/ロジック)。
メモリコストについて疑問がある場合は、それらの多くを使用することを計画している可能性があります。 Javaでは、BitSetクラスを使用できます。または、小規模では、両方の言語でビット単位の操作でビットを操作できます。

0
PhiLho

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;
0
DGentry