我有一个真正的奇怪的问题使用的海湾合作委员会对于手臂的优化开启。编我的C++应用程序没有优化产生可执行的, 在运行时输出与期望的结果。只要我打开 优化-这是-O1-我应用程序未能产生预期的结果。我试过几天发现的问题,但我一无所知。我消除了任何初始化的变量从我的代码,我纠正的斑点 严格的混淆,可能造成问题,但我仍然没有适当的结果。

我使用的海湾合作委员会4.2.0为臂(的处理器是一个ARM926ej-s)和运行的应用程序 在Montavista的Linux发行版本。

下面是标志我是使用:

-O1 -fno-unroll-loops fno-merge-constants -fno-omit-frame-pointer -fno-toplevel-reorder \
-fno-defer-pop -fno-function-cse -Wuninitialized -Wstrict-aliasing=3 -Wstrict-overflow=3 \
-fsigned-char -march=armv5te -mtune=arm926ej-s -ffast-math

只要我带的-O1标志和重新编译/重新链接应用程序,我得到适当的输出结果。正如你可以看到标志我试图禁止的任何优化我想这可能会引起问题,但仍未成功。

没有任何人有任何针对我怎么可能进一步解决这个问题?

感谢

有帮助吗?

解决方案

一般来说,如果你说的"优化打破了我的节目",它是99.9%您 programm 这是打破。能够优化,只 发现 错误代码。

你也应该去容易优化选择。只有在非常特殊的情况下会有什么需要超出标准的选择-O0,-O2-O3也许-Os。如果你觉得你 需要更多的具体设置,听取口头禅的优化:

衡量、优化措施。

从来没有 去通过的"直觉"在这里。证明一定非标准化的选择并大大受益于你的应用程序, 和理解你为什么 (即,确切地了解什么这项选择,和为什么它会影响你的代码)。

这不是一个好地方浏览蒙住眼睛。

并看到你如何使用最防御性的选项(-O1),然后禁用的一半,十几年的优化,和 然后 加ffast-数学,使我假设你在目前这样做。

嗯,也许一个-眼睛。

但底线是:如果能够优化,打破了你的代码,它是最有可能代码的错误。

编辑: 我刚刚发现这在海湾合作委员会成员手册:

-ffast-math:这个选项,绝不应通过任何-O选项 因为它可能导致不正确的输出方案,这取决于 一个确切的执行情况的IEEE或异的规则/规格的数学 功能。

这么说,基本上,你的 -O1 -ffast-math 确实可能破裂 正确的 代码。但是,即使把走 -ffast-math 消除了你的当前问题,应至少有一个主意 为什么.否则你可能仅仅是交换你的问题 现在 有一个问题在更多的不便的时刻 (一样,当你打破产品在你的客户的位置)。这是真的 -ffast-math 这就是问题所在,或者你已经打破了数学的代码 发现 通过 -ffast-math?

其他提示

-ffast-math 应该可以避免的,如果可能的。只是使用 -O1 对于现在和下落的所有其他优化开关。如果你仍然可以看到问题,那么现在是时候开始调试。

没有看到你的代码,就很难获得更多的具体比"你可能有一个错误"。

在两种情况下能够优化变化的语义的程序:

  • 有一个错误,在编译器,或者
  • 有一个错误。

后者可能是最有可能的。具体地说,你可能要依赖不确定的行为的地方在你的节目。你依赖的东西只是让发生的事是真的当你汇编使用 编译器上 计算机与 这些 编译器,但这并不保证通过的语言。因此,在启用的优化,海湾合作委员会没有义务维护这一行为。

向我们展示你的代码。或步骤,通过在调试器,直到你去哪里出了问题。

我不能有任何更加具体。它可能是一晃来晃去的指针,初始化的变量,打破了混淆规则,或甚至只是在做的许多事情,产量不确定的结果(喜欢 i = i++)

尝试做一个小测试的情况。 重写程序,除去的事情,不影响的错误。很可能你会发现错误在自己的过程,但是如果你不要,你应该有一个屏幕的例子程序 可以 员额。

顺便说一下, 如果, 正如其他人猜测,这是 -ffast-math 这会导致你的麻烦(即编写的只是 -O1 工作),则很可能你有些数学在那里你应该写的,无论如何。这是一个有点过于简化,但是 -ffast-math 许可证编译器基本上是重新计算,你可以抽象的数学数-尽管这样做在真正的硬件可能会导致略微不同的结果,因为浮点上数字不准确。依靠这种浮点的细节有可能是无意的。

如果你想了解的错误,一种极少的试验情况下是至关重要,在任何情况下。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top