2012-03-27 92 views
8

C标准不允许对结构进行某些优化:例如,重新排列字段,合并字段,丢弃永远不会读取的字段,如果字段可以变成自动变量等等,这是由于各种原因需要的,包括跨编译单元的一致的结构布局以及允许与演员兼容的结构。C编译器结构优化

是否有任何现代编译器(例如gcc,clang,Visual C)支持扩展,允许我告诉它它可以做这些优化吗?

当然,它们只适用于单个编译单元本地的定义,以便编译器可以看到该结构的所有可能用法;和某些东西(如前述的与演员兼容的结构定义)将变得无法使用。但对于某些任务,这可能是一个非常有价值的优化。

我知道,GCC 用于-fipa-struct-reorg选项允许正是这个,但是它从来没有工作非常好,有点腐烂,并最终被取出。但我不知道它是否被任何东西取代。我一直没能找到任何东西在叮当中,这令我感到惊讶,因为我认为这正是铿锵声将会全部结束的最优化类型...

+0

-flto能够优化这样的事情吗? – 2012-03-27 21:45:36

+1

如果你给结构变量存储类“register”,它*可能会有所帮助,这会强制你不依赖于语言级别的内存布局;然而,优化器应该能够弄清楚,无论是否存在“注册”,我不知道它是否在实践中有任何区别... – Christoph 2012-03-27 22:42:56

+0

不幸的是,不值得一试--- TA。 ('register'在结构成员或静态变量上无效,并且在自动变量上似乎被忽略。) – 2012-03-28 11:07:15

回答

4

不,没有理由这样要提供的东西。

  1. 如果结构地址被取走并发送到任何地方,无论如何它可能会被别名,您无法做到这一点。这几乎排除了单个函数之外的任何事情。

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

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

+0

嗯,当然,但这并不真正相关---我没有问静态分析,正如我在原始问题中所说的那样,我已经准备好避免优化结构会破坏代码的情况。 – 2012-03-28 11:16:00

+1

@DavidGiven,我正在努力想到这个功能的用例。我的答案基本上是没有一个,这就是为什么它没有提供。如果有,请将其添加到问题中。 – Ben 2012-03-28 11:34:30