例如,如果我有一个包含两个枚举的Enum,它是否比布尔类型占用更多内存?编程语言:Java、C++
enum
是一个完整的类:
为了查看每个Java编程语言中的枚举类型比其他语言中的枚举类型更加强大。枚举声明定义了一个类(称为枚举类型)。枚举类体可以包括方法和其他字段。
enum
的实际大小,让我们创建一个实际的enum
并检查它创建的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)
构造函数来创建新对象来初始化的。)enum
字段至少会产生JVM中创建对象的开销。只有在存储大量枚举时才需要担心这个问题。对于Java,您可能可以在某些情况下使用EnumSet。它在内部使用位向量,非常节省空间且快速。
http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html
bool
可能被实现为一个字节,但通常在结构体中它会被其他具有对齐要求的元素所包围,这意味着布尔值实际上至少占用与int
相同的空间。
现代处理器将数据作为整个缓存行(64字节)从主内存加载。从L1缓存加载一个字节和加载四个字节之间的差异微不足道。
如果您正在尝试优化非常高性能的应用程序的缓存行,则可能会担心枚举的大小,但一般来说,定义枚举比使用布尔值更清晰。
在Java中,这将占用更多的内存。而在C++中,它所占用的内存量与相同类型的常量所需的内存量相同(在编译时计算,运行时没有剩余意义)。在C++中,这意味着枚举的默认类型将占用与int相同的空间。
在ISO C++中,枚举类型的大小不一定比其最大枚举值所需的大小大。特别地,即使sizeof(bool)==sizeof(int),enum {TRUE, FALSE}的大小也可能为sizeof(1)。没有任何要求。有些编译器将枚举类型大小设置为与int相同。这是编译器的一个特性,因为标准只强制规定了最小值。其他编译器使用扩展来控制枚举类型的大小。
printf("%d", sizeof(enum));
int
类型具有相同的大小。尽管如此,编译器通常会提供一个命令行开关,允许将枚举类型的大小设置为适合定义值范围的最小大小。不,枚举类型通常与 int 类型相同大小,与布尔类型相同。