C编译器结构优化

标签 c compiler-construction compiler-optimization

C 标准不允许对结构进行某些优化:例如,重新排列字段、合并字段、丢弃从未读取过的字段、将字段提升到结构之外(如果它们可以转换为自动变量)等。这出于各种原因需要,包括跨编译单元的一致结构布局和允许强制转换兼容的结构。

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

自然地,它们只对单个编译单元的局部定义有意义,这样编译器就可以看到结构的所有可能用途;并且某些东西(如上述的强制转换兼容的结构定义)将变得不可用。但对于某些任务,这可能是一个非常有值(value)的优化。

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

最佳答案

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

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

  2. 如果您可以完成并进行所需的分析以标记结构成员“如果不使用,可以将其优化掉”(当心时髦的偏移计算宏),那么您可以自己看看是否需要它,自己拿出来。

  3. 如果不确定,就把它注释掉,看看是否会出现编译错误。

关于C编译器结构优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898099/

相关文章:

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果

c++ - union 中位域的 VStudio C++ 对齐

c - 如何编写一个可以同时采用动态/静态分配的二维数组的 c 函数?

c - 如何获得 C 程序的优化 RTL?

c++ - 为 mac/linux 编译时 std::pair 出错

c++ - MSVS 2015配置文件指导的优化-在各种计算机上部署仪器构建

C程序在树莓派上无法正常运行

c# - C# 编译器是否转换和存储静态变量?

c - 为什么 C99 编译器不针对 boolean 值将 "!a && b"优化为 "a < b"?

c++ - 编译器可以删除具有相同定义的重复 lambda 表达式吗?