有没有办法告诉编译器(这里是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,那么这正是会发生的事情。
答案 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。实际上,编译器的工作就是知道哪些变量在执行点的哪个寄存器中,并根据这些寄存器处理变量的操作。