gpt4 book ai didi

c++ - gcc 优化导致应用程序失败

转载 作者:太空狗 更新时间:2023-10-29 23:34:26 24 4
gpt4 key购买 nike

我在使用 GCC for ARM 并启用优化时遇到了一个真正奇怪的问题。在没有优化的情况下编译我的 C++ 应用程序会生成一个可执行文件在运行时输出预期的结果。我一打开优化 - 即 -O1 - 我的应用程序未能产生预期的结果。我尝试了几天来发现问题,但我一无所知。我从我的代码中删除了所有未初始化的变量,我更正了那些地方严格的别名可能会导致问题,但我仍然没有得到正确的结果。

我正在为 ARM 使用 GCC 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% 的程序都被破坏了。启用优化只会发现代码中的错误。

您还应该轻松使用优化选项。只有在非常特殊的情况下,您才需要标准选项 -O0、-O2、-O3 和 -Os 以外的任何其他选项。如果您觉得您确实需要比这更具体的设置,请注意优化的咒语:

衡量、优化、衡量。

永远不要在这里“直觉”。证明某个非标准优化选项确实对您的应用程序有显着好处,并理解原因(即,准确理解该选项的作用,以及它为什么会影响您的代码)。

这不是蒙着眼睛导航的好地方。

看到您如何使用最具防御性的选项 (-O1),然后禁用半打优化,然后添加 -ffast-math,让我假设您目前正在这样做.

嗯,也许是独眼。

但底线是:如果启用优化破坏了您的代码,那很可能是您的代码出了问题。

编辑:我刚在 GCC 手册中找到这个:

-ffast-math: This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions.

基本上,这确实表明您的 -O1 -ffast-math 确实可以破坏正确 代码。但是,即使去掉 -ffast-math 可以解决您当前的问题,您至少应该知道原因。否则,您可能只是将现在的问题与以后更不方便的时刻的问题交换(例如,当您的产品在客户所在地损坏时)。 -ffast-math 真的是问题所在,还是您破坏了被-ffast-math发现的数学代码?

关于c++ - gcc 优化导致应用程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com