【发布时间】:2012-04-11 11:45:13
【问题描述】:
C 标准不允许对结构进行某些优化:例如,重新排列字段、合并字段、丢弃永远不会读取的字段、将字段提升出结构(如果它们可以变成自动变量)等等。这出于各种原因需要,包括跨编译单元的一致结构布局和允许类型转换兼容的结构。
是否有任何现代编译器(例如 gcc、clang、Visual C)支持允许我告诉它进行这些优化可以的扩展?
自然,它们只对单个编译单元的本地定义有意义,以便编译器可以看到该结构的所有可能用途;并且某些东西(例如上述与演员表兼容的结构定义)将变得无法使用。但对于某些任务,这可能是非常有价值的优化。
我确实知道 gcc 使用 有一个 -fipa-struct-reorg 选项来精确地允许这样做,但它从来没有很好地工作并且有点腐烂,最终被淘汰了。但我不知道它是否被任何东西取代。而且我一直没能在clang中找到任何东西,这让我很惊讶,因为我认为这正是clang将要结束的那种优化......
【问题讨论】:
-
-flto 能够优化这样的事情吗?
-
如果你提供结构变量存储类
register,它可能会有所帮助,它强制你不依赖于语言级别的内存布局;但是,无论register是否存在,优化器都应该能够解决这个问题,我不知道它在实践中是否有任何不同...... -
不幸的是,它不起作用,但值得一试 --- ta。 (
register对结构成员或静态变量无效,并且似乎在自动变量上被忽略。)
标签: c compiler-construction compiler-optimization