【问题标题】:Switching off optimization for a specific function in gcc 4.2.2关闭 gcc 4.2.2 中特定功能的优化
【发布时间】:2008-12-27 16:45:21
【问题描述】:

是否可以关闭特定功能的优化? 我的一个朋友的问题是 gcc 优化使一些(我不知道的)μ-controller-code 不起作用。 我们知道它是哪些功能,但我们对代码本身一无所知,因此最简单和最安全的方法可能是为整个功能关闭它。

可悲的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html 显示有一个优化函数属性 / pragma,但它需要 gcc 4.4,而我们没有。

提前致谢

【问题讨论】:

  • 为什么不修复代码而不是尝试解决警告?
  • GCC 4.3.2 是当前最新发布的 GA 版本,因此没有 GCC 4.4 也就不足为奇了。您提供的信息很有趣 - 谢谢。

标签: c gcc


【解决方案1】:

如果编译指示对您不起作用,请尝试将函数拆分为自己的文件,然后在不设置优化标志的情况下编译该文件。

【讨论】:

    【解决方案2】:

    您可以将函数放在一个单独的文件中并编译该文件而不进行优化,但更好的解决方案是找出代码的问题并修复它。

    使用 gcc 启用优化时出现的最常见错误之一是严格别名。确保所有警告都已启用,并查看是否收到任何可能帮助您找出问题所在的警告。如果你想不通,试着把问题简化为一个小而完整的程序,然后在这里发布。

    【讨论】:

      【解决方案3】:

      没有将函数放在自己的文件中,我认为没有任何方法可以使用早期版本的 GCC 按函数级别关闭函数优化。但是,您可以尝试在整个程序中选择关闭某些类型的优化,而不是关闭这一功能的优化。虽然您已确定此特定功能中的错误,但这可能表明存在其他未发现的错误。

      正如其他人指出的那样,罪魁祸首可能是对'strict aliasing' 的优化。从长远来看,您可能应该修复有问题的代码,但从短期来看,您可以在命令行中添加“-fno-strict-aliasing”。在 -O2 及以上,编译器对指针之间的交互做出某些假设。添加这个选项告诉它不要做这些假设。

      如果失败,并且由于某种原因无法修复代码,您可以尝试禁用其他optimization options

      【讨论】:

        【解决方案4】:

        到目前为止的答案都忽略了原始问题中的关键词,即“微控制器代码”,在编写此类代码时很常见 with to disable 优化——激进的优化器将“优化掉”整个语句 副作用是驱动控制器。这是与应用程序不同的世界 编码。对于通常编程空间中的应用程序,我来这里寻找 获取相同的信息,以避免有 Kahan 求和的例程(参见维基百科) 优化为虚无。所以我们不要假设优化级别的变化 产生不同的程序行为自动是错误代码的标志。 巧妙地使用 volatile 关键字可以将某些东西混为一谈,在某些情况下 应该生成实际的汇编语言并检查它。 (我相信这个 仍然可以通过 -S 切换到 gcc 来完成)。让我们记住 C 的目的是 一种便携式汇编器,而不是一种 COBOL。

        戴夫

        【讨论】:

          【解决方案5】:

          我不能肯定地说,但据我所知,没有这种可能性。但是,优化永远不应该改变定义良好的代码的语义。这里唯一可能发生的事情是变量被内联或读/写顺序被改变。

          可以通过将涉及的变量声明为volatile 来解决第一个问题,也可能是这两个问题,从而向编译器表明不应仅根据程序流对其内容进行假设。

          【讨论】:

          • 我考虑过这个,将它作为函数属性或类似的东西会很好。谢谢
          【解决方案6】:

          我知道这是一篇旧帖子。 OP 给出的 GCC 页面实际上说: 为了防止这样的调用被优化掉,把 asm ("");在函数中。 我想这是一个简单的解决方法。这个就好了,希望能帮到你 其他人喜欢我。

          【讨论】:

            【解决方案7】:

            对于仍在使用旧版 gcc 的人: 较新版本的 gcc 解决了这个问题。我已经在 gcc-4.5.1 中成功使用了它。 祝你好运。

            【讨论】:

            • 请告诉如何使用该版本。
            猜你喜欢
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 2013-07-07
            • 2016-04-26
            • 1970-01-01
            • 2010-09-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多