告诉gcc编译器在优化

时间:2016-12-20 14:50:35

标签: c gcc optimization compilation compiler-options

有没有办法告诉编译器(这里是gcc)它不应该优化它认为常量表达式常量的变量?一般来说,通过编译器标志,甚至更好地使用特定变量的属性?

我希望(本地)变量真正存在,每次读取此变量都要实际执行,也要每次写入,即使我再次写入相同的值。

如果我不进行优化,它总是从/向RAM加载/存储变量。如果我将其声明为volatile,则相同。但是,我确实希望它能够保存在寄存器中,就像一个既不恒定也不易变的普通变量。完全禁用优化也不是一种选择。

代码示例(r(a)和r(b)是任何寄存器):
    int a,b;
    a = 2;
    a = 2;
    b = a;
结果(稍后提供b,不再提供):
    忽略的线
    忽略的线
    在r(b)中移动2 a由常量表达式2替换

volatile int a;  
int b;  
a = 2;  
a = 2;  
b = a;  

结果(稍后需要b,无关紧要):
    在r2中移动2,在r3中放入a的地址,将r2写入RAM(r3)
    将r2再次写入RAM(r3)
    将RAM(r3)读入r4
    在r5中放入b的地址,将r4写入RAM(r5)

正如您所看到的,效率非常低。我想要的是什么:
    在r(a)中移动2     再次在r(a)中移动2     将r(a)写入r(b)
    如果其他内容需要寄存器,则将a和b存储在RAM中 如果a是一个真正的变量而不仅仅是2,那么这正是会发生的事情。

3 个答案:

答案 0 :(得分:1)

对于这样的要求,你不能用C来做这件事。不可能指定变量物理位置(RAM与注册表)。海湾合作委员会的重点是为你照顾。

您必须编写自己的汇编代码才能使用加载操作。

答案 1 :(得分:1)

C和GCC都没有针对您描述的内容的机制。最接近的是声明变量volatile,它具有以下效果:

  

[...]任何引用[a volatile]对象的表达式都应严格按照抽象机的规则进行评估,如5.1.2.3所述。此外,在每个序列点,最后存储在对象中的值应与抽象机器规定的值一致,除非由前面提到的未知因素修改。

(C2011,6.7.3 / 7;重点补充)

主要是突出显示的部分与问题有关,因为它需要实际读取和写入变量的存储值。它不一定会阻止变量被分配给寄存器,因为标准对CPU寄存器没什么好说的,但它可能在某些实现中具有这种效果。 (我不能直接谈到海湾合作委员会在这方面的行为。)

答案 2 :(得分:1)

  

如果我不进行优化,它总是从/向RAM加载/存储变量。

不,那不是CPU或编译器的工作方式。

虽然C,至少对于外部可见对象,保证非临时对象具有可比较的地址引用,但编译器绝对没有理由从以下内容生成C代码:

a

任何汇编程序,每次触摸{"error":"BadRequest","description":"Orion accepts no payload for GET/DELETE requests. HTTP header Content-Type is thus forbidden"}时,都会从RAM加载并将其存储回RAM。实际上,编译器的工作就是知道哪些变量在执行点的哪个寄存器中,并根据这些寄存器处理变量的操作。

相关问题