枚举需要多less内存?

例如,如果我有两个情况下的枚举,它是否需要比布尔值更多的内存? 语言:Java,C ++

在Java中, enum是一个成熟的类 :

Java编程语言枚举types比其他语言中的对应语言更强大。 枚举声明定义了一个类(称为枚举types)。 枚举类的主体可以包含方法和其他字段。

为了查看每个enum的实际大小,让我们制作一个实际的enum并检查它创build的class文件的内容。

比方说,我们有以下Constants枚举类:

 public enum Constants { ONE, TWO, THREE; } 

编译上面的enum并用javap反汇编生成的class文件给出以下内容:

 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)构造函数创build一个新对象来初始化每个字段。

因此,我们可以知道,我们创build的每个enum字段至less与在JVM中创build对象的开销一样多。

在Java中,应该只有内存中每个枚举值的一个实例。 对枚举的引用则仅需要该引用的存储空间。 检查枚举的值与其他任何参考比较一样有效。

存储大量枚举时,您只会担心这一点。 对于Java,在某些情况下,您可能可以使用EnumSet。 它在内部使用一个位vector,非常节省空间和快速。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html

bool可能被实现为单个字节,但通常在一个结构中,它将被其他具有alignment要求的元素所包围,这意味着该布尔将有效地占用至less与int相同的空间。

现代处理器从主存储器加载数据作为整个高速caching行,64字节。 从L1caching加载一个字节和加载四个字节之间的差异是可以忽略的。

如果你想在一个非常高性能的应用程序中优化caching行,那么你可能会担心你的枚举有多大,但通常我会说定义枚举比使用布尔值更清晰。

在Java中,需要更多的内存。 在C ++中,它将不会使用相同types的常量所需的内存(它在编译时进行评估,并且在运行时没有剩余的意义)。 在C ++中,这意味着枚举的默认types将占据与int相同的空间。

在ISO C ++中,枚举的大小不能超过其最大枚举器的要求。 特别是,即使当sizeof(bool)== sizeof(int)时,enum {TRUE,FALSE}也可能有sizeof(1)。 根本没有要求。 一些编译器使枚举的大小与int相同。 这是一个编译器function,这是允许的,因为这个标准只会规定一个最小值。 其他编译器使用扩展来控制枚举的大小。

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

在C ++中,枚举的大小通常与int相同。 也就是说,编译器提供一个命令行开关来允许将枚举的大小设置为符合定义值范围的最小大小并不罕见。

不,枚举的大小与int相同,与布尔值相同。

如果你的枚举只有两种情况,实际上使用布尔值可能是一个更好的主意(内存大小,性能,用法/逻辑),在Java中更是如此。
如果你想知道内存的成本,这可能意味着你打算使用它们中的大部分。 在Java中,您可以使用BitSet类或更小规模的两种语言,您可以使用按位操作来处理位。

sizeof(枚举)取决于你在枚举中有什么。 我最近试图find具有默认构造函数参数的ArrayList()的大小,并没有存储在里面的对象(这意味着存储的容量是10)。 原来ArrayList不是太大<100字节。

所以,一个非常简单枚举的sizeof(enum)应该小于10个字节。 你可以编写一个小程序,给它一定的内存,然后尝试分配枚举。 你应该能够弄清楚(这就是我如何发现ArrayList的内存)

BR,
〜一

在C / C ++中,枚举的大小与int相同。

有了gcc,你可以添加属性 ((打包))的枚举定义,使其占用最小的足迹。 如果枚举中的最大值<256,那么这将是一个字节,如果最大值是<65536等,则是两个字节。

 typedef enum { MY_ENUM0, MY_ENUM1, MY_ENUM2, MY_ENUM3, MY_ENUM4, MY_ENUM5 } __attribute__((packed)) myEnum_e;