编译器的优化与人为防止优化


1.编译器的优化魔法


在没有同步原语的情况下,编译器可以(通常是为了性能)在(当前线程)结果不变的情况下
自由地调整执行顺序:
(1)同步源于包括互斥锁操作,内存屏障和原子操作等:
(2)被调整的例子:   
   例子:x = a; y = 2;可以变成:y = 2;x=a;
   例子:x = y + 1;y = x+2;可以变为 t = y; y+=3; x= t+1;
(3)局部变量可能被完全消除;
(4)全局变量只保证在下一个同步点来之前写回到内存里;
(5)volatile声明会禁止编译器进行相关的优化.

2.防止优化的技巧


1.使用全局变量;
2.使用锁来当做简单的内存屏障;
3.可使用__attribute__((noinline))来防止意外内联;
4.引用变量来防止其被优化掉.

3.volatile 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防止编译器优化是为了确保代码的行为与我们期望的一致,并避免由于编译器过度优化而引发的意外问题。虽然编译器优化可以提高程序的性能和效率,但有时候过度优化可能会导致以下问题: 1. 逻辑错误:编译器可能会根据其对代码的理解进行优化,这可能导致代码的行为与我们预期的不一致。例如,编译器可能会移动、删除或合并某些代码,从而改变了代码的逻辑流程。 2. 副作用丢失:编译器可能会认为某些代码的结果没有被使用,从而将其删除。然而,这些代码可能具有副作用,例如修改全局变量或调用外部函数。如果这些副作用被删除,将导致程序出现错误。 3. 调试困难:编译器优化后的代码可能与源代码的结构和行为差异很大,这会给调试带来困难。在调试时,我们通常期望能够按照源代码的逻辑进行单步调试或查看变量的值,但过度优化后的代码可能难以理解和跟踪。 为了避免上述问题,我们可以使用一些方法来防止编译器过度优化,例如使用`volatile`关键字标记可能具有副作用的变量,或者使用`__attribute__((optimize("O0")))`指令告诉编译器关闭优化。这样可以确保编译器尽可能地按照我们的意图执行代码。 需要注意的是,防止编译器优化并不是说所有的优化都是坏的,实际上,合理的优化可以显著提高程序的性能和效率。但在某些情况下,我们需要谨慎处理优化,以确保代码的行为符合我们的预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值