C编译器结构优化

Dav*_*ven 8 c compiler-construction compiler-optimization

C标准不允许对结构进行某些优化:例如,重新排列字段,合并字段,丢弃从未读取的字段,如果可以将字段转换为自动变量,则将字段提升出结构等.这是需要的各种原因,包括编译单元之间的一致结构布局以及允许与流兼容的结构.

做任何现代编译器(如GCC,铛,视觉C)支持扩展,让我告诉它好做这些的优化?

当然,它们只对单个编译单元本地的定义有意义,因此编译器可以看到结构的所有可能用途; 某些事情(如上述与演员兼容的结构定义)将变得无法使用.但对于某些任务,这可能是一个非常有价值的优化.

我知道gcc 曾经有一个-fipa-struct-reorg选项可以准确地允许这个,但它从来没有很好地工作,有点腐烂,最终被取出.但我不知道它是否被任何东西所取代.而且我一直没能在clang中找到任何东西,这让我感到惊讶,因为我认为这正是clang将会遍布的那种优化......

Ben*_*Ben 4

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

  1. 您不能在获取结构地址并将其发送到任何地方的情况下执行此操作,因为无论如何它都可能是别名。这几乎排除了单个函数之外的任何内容。

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

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