【问题标题】:C compiler structure optimisationC编译器结构优化
【发布时间】: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


【解决方案1】:

没有。没有理由提供这种东西。

  1. 你不能在结构的地址被获取并发送到任何地方的地方这样做,因为它可能会被别名。这几乎排除了单个函数之外的任何内容。

  2. 如果您可以通过并执行所需的分析来标记结构成员“如果不使用可以优化掉”(注意时髦的偏移计算宏),那么您可以自己查看是否需要它,然后自己拿出来。

  3. 如果不确定,只需将其注释掉,看看是否出现编译错误。

【讨论】:

  • 嗯,当然,但这并不相关——我不是在问静态分析,正如我在原始问题中所说,我已经准备好避免优化的情况这些结构会破坏代码。
  • @DavidGiven,我正在努力思考这个功能的用例。基本上,我的回答是没有,这就是不提供它的原因。如果有,请将其添加到问题中。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 2018-01-19
  • 2012-02-09
  • 1970-01-01
  • 2010-12-13
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多