【发布时间】:2016-03-04 17:34:22
【问题描述】:
在 C 和 C++ 中,编译器不允许对结构的数据成员进行重新排序,因此如果您不注意如何对它们进行排序,最终会浪费空间。例如:
struct S {
int i;
void *p;
int i2;
};
在具有 32 位 ints 和 64 位指针的平台上,i 将首先放置,然后是 32 位填充,以便 p 可以 64 位对齐。 i2 然后占据下一个字的一半,然后是另外 32 位的填充。生成的结构是 24 字节长,而如果首先声明 p,它将只有 16 字节长。如果数组中有很多这样的结构,查找和删除填充有时可能是一项重要的优化,以节省内存并减少缓存流失。
我很想知道 Java 是否具有相同的功能。未装箱的类型(例如int 和boolean)是否与引用的大小相同或更小?如果它们更小,是否允许编译器重新排序它们以避免插入填充以对齐后续字段?最后,如果是的话,有没有编译器会这样做?
我现在对此没有特别的优化需求,我只是想知道在选择声明字段的顺序时是否应该记住这一点,就像我在 C 中所做的那样。
【问题讨论】:
标签: java optimization bytecode