c - 是否可以针对特定代码段禁用 gcc/g++ 优化?

标签 c gcc optimization

我正在编译一些代码,这些代码无需优化即可运行,但在启用优化后会中断。我怀疑代码的某些关键部分被优化掉了,导致逻辑中断。

我想做这样的事情:

code...

#disable opt

more code...

#enable opt

如果我可以为该部分设置优化级别(如 O0、O1...),那就更好了

对于那些建议它是代码的人:

被删除的代码部分是(通过反汇编目标文件检查):

void wait(uint32_t time)
{
  while (time > 0) {
    time--;
  }
}

我严重怀疑那段代码有问题

最佳答案

如果优化导致你的程序崩溃,那么你有一个错误并且应该修复它。通过不优化这部分代码来隐藏问题是一种糟糕的做法,它会使您的代码变得脆弱,就像为下一个支持您的代码的开发人员留下地雷一样。更糟糕的是,忽略它,您将无法学习如何调试这些问题。

一些可能的根本原因:

硬件访问被优化:使用Volatile 关键代码不太可能被优化掉,但如果您正在接触硬件寄存器,那么您应该添加 volatile 属性以强制编译器访问这些寄存器,而不管优化设置如何。

竞争条件:使用 Mutex or Semaphore控制对共享数据的访问 您更有可能遇到特定于时序的竞争条件,并且优化会导致此时序条件自行显示。这是一件好事,因为这意味着您可以修复它。您是否有多个线程或进程访问相同的硬件或共享数据?您可能需要添加互斥量或信号量来控制访问以避免时序问题。

Heisenbug : 这是代码行为根据是否添加调试语句或代码是否优化而改变的时候。有一个很好的例子here优化代码在寄存器中以高精度进行浮点比较,但是当添加 printf 时,这些值将存储为 double 值并与精度较低的值进行比较。这导致代码以一种方式失败,而不是另一种方式。也许这会给您一些想法。

定时循环得到优化:创建一个等待函数,该函数通过创建一个递增局部变量的定时循环来工作以增加延迟,这不是好的编程风格。可以根据编译器和优化设置完全优化此类循环。此外,如果您移动到不同的处理器,延迟量也会发生变化。延迟函数应该基于 CPU 滴答或实时工作,这不会得到优化。让延迟函数使用 CPU 时钟或实时时钟,或调用标准函数,例如 nanosleep() 或 use a select with a timeout .请注意,如果您使用的是 CPU 节拍,请务必很好地注释函数并突出显示实现需要特定于目标。

底线:正如其他人所建议的那样,将可疑代码放在一个单独的文件中,然后在不进行优化的情况下编译该单个源文件。对其进行测试以确保其正常工作,然后将一半代码迁移回原始代码,并重新测试一半优化的代码,另一半未优化的代码,以确定您的错误在哪里。一旦你知道哪一半有 Heisenbug,使用分而治之的方法重复这个过程,直到你找到优化时失败的最小代码部分。

如果那时您能找到错误,那就太好了。否则,请在此处发布该片段,以便我们帮助调试它。提供用于在优化时导致其失败的编译器优化标志。

关于c - 是否可以针对特定代码段禁用 gcc/g++ 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44212568/

相关文章:

c - gcc gdb building - "lvalue required as increment operand"on *((void **)__o->next_free)++ = ((void *)datum);

python - 用于 Lucas-Lehmer 素数测试的更快的按位模数

ios - GCD -dispatch_async 在主队列上工作,但在后台队列上崩溃

c - 访问已分配内存中的变量

c++ - GCC/GCOV 为使用 throw()/noexcept 的函数生成的不同分支覆盖

c - GBA C 编程编译器 gcc

c - C 中的指针忽略无符号特征?

c - 关于如何对这一行进行编程的建议

algorithm - 写一个高效的方法

ios - CGGraphics 内存和优化问题