从下面的“C”代码片段中哪一个更有效(1或2),为什么?请详细说明一下。提前致谢!
//I am doing some operation with this macro.
#define ERRMAP( sts ) ((A_AB( sts ) < FIRST_ERR) ? \
sts : \
((A_AB( sts ) > A_AB( LAST_ERR )) ? \
sts : \
sts_to_errno_m[A_AB( sts ) - FIRST_ERR]))
//Code snippet 1
int some_fun (int sts) {
int i = ERRMAP( sts );
printf(" sts = %d", i);
return i;
}
//Code snippet 2
int some_fun (int sts) {
printf(" sts = %d", ERRMAP( sts ));
return (ERRMAP( sts ));
}
答案 0 :(得分:3)
如果没有先做一些重要的测量,请不要担心“效率最高”。 “高效”也意味着许多不同的东西。在执行时间方面有效吗?代码大小?内存使用情况? “高效”不是“最快”的同义词。
不要担心哪个是最快的,而要考虑哪种方式最清楚。最昂贵的时间是程序员时间。
答案 1 :(得分:1)
不要这样做:
int some_fun (int sts) {
printf(" sts = %d", ERRMAP( sts ));
return (ERRMAP( sts ));
}
有一天,如果修改ERRMAP以产生副作用,那么在打印和返回的内容之间会得到不同的结果。
进行一次计算也是一个好主意。无论ERRMAP是函数还是宏,这都是最好的:int i = ERRMAP( sts );
答案 2 :(得分:1)
据推测,A_ABS
也是一个像宏的功能!基本的诀窍是将你的头脑中的伪机器代码解析出来 - 假设A_ABS
具有类似的复杂性并且不再调用任何东西 - 然后我会将它们中的每一个放在大约20个操作码中总共40个 - 使用它们并分配给一个值然后使用该值两次将是42 - 而“调用”两次将是80,所以你可以解决它。
顺便说一句 - 你应该只考虑做这种宏,(比如函数),如果你尝试过使用一个函数,你的探查器已经说过这是主要原因之一你的代码太大或太慢。原因: