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