c - GCC 优化可能产生的副作用是什么?

标签 c gcc

作为新手,我想弄清楚使用 GCC 优化标志时会发生什么。哪些优化标志可能会产生副作用。我应该避免使用优化的特定情况。我想优化可以破坏一些多线程代码,但还有什么?

最佳答案

编译器的优化通常会努力保留实现定义的行为(有一些异常(exception),特别是对于未通过一般 -O 启用的激进浮点优化)旗帜)。换句话说,如果您的程序的功能行为因优化而改变,则该程序可能正在调用 unspecified behavior undefined behavior .

您应该始终避免编写调用未定义行为的程序,并确保未指定的行为不会影响程序的结果。问题不在于优化,而在于调用未定义的行为或为未指定的行为提供影响结果的机会。如果您更改编译器或编译器版本,即使您在没有优化的情况下继续编译,这些也会导致麻烦。

按照措辞回答您的问题:

  • 优化可以使未初始化的变量同时显示为 true and false ,或未初始化变量乘以两个 result into an odd value .不要使用未初始化的变量,因为这基本上是未定义的行为。

  • 通过优化,有符号算术溢出可能会导致 int 类型的表达式显然具有大于 INT_MAX 的值。函数 int f(int x) { return x+1 > x; ,经过优化编译,在应用于 INT_MAX 时返回 1。要避免这种奇怪的行为,根本就不要依赖有符号算术溢出,这是未定义的行为。

  • 通过优化,悬挂指针可以 be different and identical同时:不要对任何东西使用悬挂指针。

  • 通过优化,可以在编译时计算调用未定义行为的常量表达式,其语义不同于未优化生成的汇编指令的运行时语义。对于比类型大小更宽的移位,预计会发生这种情况:对于 32 位 int,表达式 1 >> 32 可以计算为 0 有优化,1 没有。 overflows in the conversion from floating-point to integer 也会发生同样的情况: 它们也是未定义的行为。

关于c - GCC 优化可能产生的副作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351315/

相关文章:

c - 发现 IP 地址是 DHCP 还是静态

c - 使 2 个循环并行运行

c - 在 Linux 上使用 gcc 链接共享库

c++ - 编译 gcc-4.8.1 : "libmpc.so.2 cannot open shared object file download prerequisites"

c++ - 如何优化指针间接层

c++ - 是使用引入一个新的成员函数还是只是一个别名?

c - 为什么 050 不等于以下代码段中的 50?

c - 反转字符串时获取 "Segmentation fault Core Dumped Error "

python - 如何将不同大小的数组列表从 python 传递到 C?

c - gcc -ffp-contract 选项的区别