【发布时间】:2012-10-22 17:14:15
【问题描述】:
假设我想在设置标志时更改变量的值。一个明显的方法如下。
int a = 1, b = 2;
if(Flag)
{
a=b;
Flag = false;
}
然而,WRT 为执行操作而生成的代码效率非常低。我发现执行该操作的代码减少了 40%。
a = ((!Flag)*a)+((Flag)*b);
Flag = false;
我的问题:我宁愿不使用乘法“*”运算符,因为乘法/除法运算符在我的目标上执行速度较慢。在不增加代码空间的情况下,我还能用什么来加快速度?
编辑: 目标设备是运行在 kHz 范围内的 MSP430。代码空间和执行时间至关重要。编译器是 IAR C
【问题讨论】:
-
当
Flag是false时,a = ((!Flag)*a)+((Flag)*b);不会以不必要的a=a分配结束吗?你不想使用条件来避免这种情况吗? -
@Mike 是的,但是生成的代码仍然比使用条件时要少。
-
::face palm:: 不要。只是,不要。使用好的编译器并让它进行优化。 It is almost certainly better at it then you are 和人们(包括你未来的自己)将能够阅读你的代码。请注意上面写着 “gcc 在所有平台上都比视频编解码器程序员更聪明”的部分。(第 41 页)
-
@dmckee 编译器是 IAR C。我可以向你保证,这是一个非常好的(且昂贵的)编译器。
-
int b = 2, a = Flag ? b : 1; Flag = false;怎么样?
标签: c optimization flags logical-operators