选项 -fipa-struct-reorg=n
使用该选项控制内存空间布局优化系列优化。
- -fipa-struct-reorg=0 不启用任何优化。
- -fipa-struct-reorg=1 启用结构体拆分和结构体数组优化,等同使用-fipa-struct-reorg
- -fipa-struct-reorg=2 在 -fipa-struct-reorg=1 的基础上,新增结构体成员重排-fipa-reorder-fields
- -fipa-struct-reorg=3 在-fipa-struct-reorg=2 的基础上,新增结构体冗余成员消除优化。结构体冗余成员消除,消除结构体中从不读取的结构体成员,同时删除冗余的写语句。 将以下结构体:
struct S { type1 field1; // Never read in whole program type2 field2; };
转化为
struct S.layout { type2 field2; };
- -fipa-struct-reorg=4 在-fipa-struct-reorg=3的基础上,新增安全结构体指针压缩优化。
结构体指针压缩将结构体域成员中的结构体指针压缩至可选的8、16和32 bits,缩小结构体占用内存大小,降低从内存中读写数据时的带宽压力,从而提升性能。
- 安全的结构体指针压缩仅支持结构体数组大小在编译期间已知的场景。
- 使用--param compressed-pointer-size=[8,16,32]控制压缩目标大小,默认取值为32。
将以下结构体:
struct S { struct S* field1; type2 field2; };
转化为:
struct S.layout { uint32_t field1.pc; type2 field2; };
- -fipa-struct-reorg=5 在-fipa-struct-reorg=4的基础上,放宽了结构体指针压缩优化的应用场景。
该等级支持结构体数组大小在编译期间未知的场景,用户需自行确认压缩等级合法,不同等级支持的最大结构体数组大小如下表所示。
指针大小
最大支持数组范围
8
254(0xff-1)
16
65534(0xffff-1)
32
4294967294(0xffffffff-1)
- -fipa-struct-reorg=6 在-fipa-struct-reorg=5的基础上,新增结构体数组semi-relayout优化。*
semi-relayout在一定范围内,将结构体数组中各结构体的成员打包后重排,提高数据空间局部性,从而提升性能。
- 通过参数--param semi-relayout-level=[11,12,13,14,15]控制semi-relayout的重排规模,默认值为13,即semi-relayout将每1024个结构体作为一组进行重排,不足1024的情况下以padding的形式补齐1024个结构体空间;计算方式:(1 << semi-relayout-level) / 8。
- 将以下结构体数组在内存中的排布形式从连续的结构体按照如下图形式转换。
图1 semi-relayout优化原理示意图
struct S { long a, int b, short c };
使用方法
在选项中加入:
-O3 -flto -flto-partition=one -fipa-struct-reorg=n
其中n取值范围为[0,6]。

-fipa-struct-reorg=n选项,需要在-O3 -flto -flto-partition=one全局同时开启的基础上才使能。
父主题: 静态编译优化