枚举与静态常量,内存占用

Nam*_*ace 17 java enums android

首先请参阅Android开发人员指南中的以下引用:

尽管在第一个要点"严格避免在Android上使用枚举"中发出了不祥的警告,但在这一点上所说的实际上听起来并不是那么糟糕.常量是32位整数,枚举可能是64位引用.在那里给出的关于枚举价格贵两倍的数学是有道理的,而且看起来并不那么可怕.

我担心的是,警告可能部分取决于第二个要点.

我想知道一个简单的枚举"类"声明是否带有500字节的开销?eacn enum类型怎么样?

似乎很有道理,类型可以是"扩展类",因为它们可以采用自己的方法,而不仅仅是实例.要将它短语作为一个问题,如果我的枚举是Color,并且我有20种颜色枚举类型(例如红色,蓝色,绿色......),那么每种类型是500个字节吗?

Lui*_*ano 18

枚举是Android世界中一直存在的无限争论.

你可以在这里听到Romain Guy和Chet Haase的好话:http://www.parleys.com/play/5298f999e4b039ad2298c9e3/chapter57/about

根据这段视频,达尔维克的物体有多大可以计算为:

overhead of Object + overhead of dlmalloc + data + align
Run Code Online (Sandbox Code Playgroud)
  • Object的开销正好是8个字节.
  • dlmalloc的开销可以是4-8个字节(大多数时间是8个字节)
  • 数据的大小取决于数据(当然)
  • 最后,所有内容都必须是8字节对齐的(例如,如果对象有12个字节,则需要16个字节)

请记住,枚举的每个值实际上都是Enum类的一个实例.

要记住的另一个要点是dex文件大小.例如,以下枚举将占用大约1,112个字节

public static enum Things {
    THING_1,
    THING_2;
};
Run Code Online (Sandbox Code Playgroud)

或者你可以有两个静态int,它将占用128个字节.

public static int THING_1 = 1;
public static int THING_2 = 2;
Run Code Online (Sandbox Code Playgroud)

你的dex文件大小有10倍的改进.

关于生成多少编译的dalvik代码也有很大的不同.对于Enum,编译器会为您做很多事情.第一次在运行时加载类时会有一个静态类初始化.它在启动时增加了加班时间.

另一方面,枚举也带来了很多优点:可读性,可用性,类型安全代码.我只会在特殊的极端情况下担心枚举.

特别是当我们考虑使用ProGuard可以优化Enums将它们转换为正常的int常量时.