我在做嵌入式C,有人能帮我一下哪一段代码吗?
在健壮性、记忆性以及Misra友好性方面是否有效?
Code1:
if (func() == 1 || func() == 2) {
/* Body of the function */
}Code2:
locvar = func();
if (locvar == 1 || locvar == 2) {
/* Body of the function */
}发布于 2022-01-12 11:09:13
对于@Lundin的回答,唯一的MISRA :2012的考虑是,如果func()内部存在持续的副作用--如果没有持久的副作用--那么MISRA就没有什么可说的了。
同样地,从代码效率的角度来看,一个高效的编译器(可能)会优化代码-它甚至可能inline函数体无论如何.
对我来说,首要考虑的是代码的可读性(因此也是可维护性)--一个调用就可以清楚地说明您在做什么……如果没有持久的副作用,那么进行第二个函数调用会得到什么好处呢?
我投票赞成第二条规则。
发布于 2022-01-12 08:39:59
如前所述,这两个例子可以做不同的事情,并给出不同的结果。
MISRA遵从性和健壮性并驾齐驱。至于内存的使用,这在这段代码中不是问题。
第一个例子可能不健壮,也不符合MISRA标准:具体来说,MISRA:2012规则13.5禁止&&和||的右操作数包含持久的副作用。
此外,像12.1这样的规则要求大型表达式的子表达式被括号包围,以使运算符优先级显式化。
兼容MISRA-C的版本如下所示:
locvar = func();
if ((locvar == 1) || (locvar == 2)) {
...
}发布于 2022-01-12 20:19:43
理论上,计算分支条件中使用的值可以改善处理器的分支预测,但是优化的编译器应该会这样做。认为这个答案可能很有趣:
conditional data transfers VS n conditional control transfers(using conditional mov) in Assembly
https://stackoverflow.com/questions/70678091
复制相似问题