当前位置:  开发笔记 > 编程语言 > 正文

Enums需要多少内存?

如何解决《Enums需要多少内存?》经验,为你挑选了4个好方法。

例如,如果我有一个包含两种情况的枚举,它是否会占用比布尔值更多的内存?语言:Java,C++



1> coobird..:

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

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

为了查看每个的实际大小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 {};
}

反汇编显示an的每个字段enum都是Constants enum类的实例.(进一步分析javap将揭示通过new Constants(String)在静态初始化块中调用构造函数来创建新对象来初始化每个字段.)

因此,我们可以告诉enum我们创建的每个字段至少与在JVM中创建对象的开销一样多.


在32位平台上,它的大小与int完全相同 - 它只是指向枚举实例的(32位)指针.内存中只存在每个枚举值的一个实例.
-1"比普通整数重一点"?这是什么意思,你从文本中得到了什么?

2> thenickdude..:

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



3> Tom..:

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

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



4> Mike Dimmick..:

bool可能被实现为单个字节,但通常在结构中它将被具有对齐要求的其他元素包围,这意味着布尔将有效地占据至少与空间一样多的空间int.

现代处理器从主存储器加载数据作为整个高速缓存行,64字节.从L1高速缓存加载一个字节和加载四个字节之间的区别可以忽略不计.

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

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有