是否有GCC关键字允许结构重新排序?

我知道为什么GCC默认不重新排序结构的成员,但我很少编写依赖于结构顺序的代码,所以有什么方法可以标记我的结构自动重新排序?

以前的GCC版本具有-fipa-struct-reorg选项 ,允许在-fwhole-program + -combine模式下进行结构重新排序。

  • -fipa-struct-reorg
    执行结构重组优化,改变C类结构布局以更好地利用空间局部性。 此转换对包含结构数组的程序有效。 提供两种编译模式:基于配置文件(使用-fprofile-generate启用)或静态(使用内置启发式)。 需要-fipa-type-escape来提供此转换的安全性。 它仅适用于整个程序模式,因此需要-fwhole-program-combine 。 通过此转换认为'cold'的结构不受影响(请参阅--param struct-reorg-cold-struct-ratio=value )。

由于发布说明中的以下原因,它自GCC 4.8.x后被删除

结构重组和矩阵重组优化(命令行选项-fipa-struct-reorg-fipa-matrix-reorg )已被删除。 它们并不总是正常工作,也不适用于链接时优化(LTO),因此仅适用于由单个翻译单元组成的程序。

但是你仍然可以在GCC SVN上尝试使用struct-reorg-branch ,因为它仍然在积极开发中。

海湾合作委员会没有这样的选择。 而且,我确定,它不能以任何合理的方式介绍。 关于填充优化,请查看此讨论 。

我知道的唯一例外是热/冷结构字段分裂,在某些情况下可以完成(我仍然不确定,GCC甚至可以在配置文件引导模式下完成它,我知道ICC可以)。 此function不受用户控制,并且在调用图上执行,其中可以certificate这种转换对数据流的保守性。

我认为在编译整个程序时可以重新组织/拆分struct的元素(lto模式,使用-flto标志)。 在这种情况下,您可以获得程序的完整图片,对于不能转义的符号,应该可以重新排序它们以获得更好的缓存行为等。

在gcc主干中,这是在积极发展。 这是在GNU cauldron 2015中提出的。您可能想尝试gcc trunk或struct-reorg-branch。

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf