C 哪种代码更有效?对一个宏调用两次,还是将宏赋给一个变量并使用两次?
从下面的“C”代码片段中,哪一个更有效(1或2),为什么?请解释一下。提前谢谢C 哪种代码更有效?对一个宏调用两次,还是将宏赋给一个变量并使用两次?,c,C,从下面的“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 )) ? \
//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 ));
}
//我正在用这个宏执行一些操作。
#定义错误映射(sts)((A_AB(sts)<第一个错误)\
sts:\
((A_AB(sts)>A_AB(LAST_ERR))\
sts:\
sts-to-errno-m[A_AB(sts)-FIRST-ERR]))
//代码片段1
int some_fun(int sts){
int i=错误映射(sts);
printf(“sts=%d”,i);
返回i;
}
//代码片段2
int some_fun(int sts){
printf(“sts=%d”,ERRMAP(sts));
返回(ERRMAP(sts));
}
不要这样做:
int some_fun (int sts) {
printf(" sts = %d", ERRMAP( sts ));
return (ERRMAP( sts ));
}
总有一天,如果ERRMAP被修改为有副作用,那么在打印和返回的内容之间,您将得到不同的结果
同样,计算一次也是个好主意。无论ERRMAP是函数还是宏,这都是最好的:inti=ERRMAP(sts)代码>不要这样做:
int some_fun (int sts) {
printf(" sts = %d", ERRMAP( sts ));
return (ERRMAP( sts ));
}
总有一天,如果ERRMAP被修改为有副作用,那么在打印和返回的内容之间,您将得到不同的结果
同样,计算一次也是个好主意。无论ERRMAP是函数还是宏,这都是最好的:inti=ERRMAP(sts)代码>请不要担心“最有效”的问题,除非事先做了一些重要的测量。此外,“高效”可能意味着许多不同的事情。在执行时间方面是否高效?代码大小?内存使用情况?“高效”不是“最快”的同义词
与其担心哪条路最快,不如想想哪条路最清晰。最昂贵的时间是程序员时间。请不要担心“最有效”的问题,除非事先做了一些重要的度量。此外,“高效”可能意味着许多不同的事情。在执行时间方面是否高效?代码大小?内存使用情况?“高效”不是“最快”的同义词
与其担心哪条路最快,不如想想哪条路最清晰。最昂贵的时间是程序员时间。大概A_ABS
也是一个类似宏的函数!最基本的技巧是在你的头脑中把它转换成伪机器代码——比方说,A_ABS
具有类似的复杂性,并且不再调用任何东西——然后我将它们每个放在大约20个操作代码中,总共40个——使用它们并分配给一个值,然后使用该值两次将是42个——同时“调用”两次等于80,所以你算了
顺便说一句-如果您尝试使用函数,并且探查器指出这是代码太大或太慢的主要原因之一,那么您甚至应该考虑执行此类宏(即类似函数)。原因是:
宏中的错误对于编译器来说很难报告的位置-您有5行,最多80个字符,但是任何编译器错误都会在您“调用”代码的地方报告
您正在击败类型检查,这是C/C的主要优点之一++
除了作为机器代码之外,调试是不可能的,因为您不能
单步执行宏
这是一场维护噩梦
编译器优化人员通常不会在这方面做得很好
代码检查器在宏上不能很好地工作
MISRA和其他编译检查器将使您的代码失败
这通常是不必要的李>
大概A_ABS
也是一个类似宏的函数!最基本的技巧是在你的头脑中把它转换成伪机器代码——比方说,A_ABS
具有类似的复杂性,并且不再调用任何东西——然后我将它们每个放在大约20个操作代码中,总共40个——使用它们并分配给一个值,然后使用该值两次将是42个——同时“调用”两次等于80,所以你算了
顺便说一句-如果您尝试使用函数,并且探查器指出这是代码太大或太慢的主要原因之一,那么您甚至应该考虑执行此类宏(即类似函数)。原因是:
宏中的错误对于编译器来说很难报告的位置-您有5行,最多80个字符,但是任何编译器错误都会在您“调用”代码的地方报告
您正在击败类型检查,这是C/C的主要优点之一++
除了作为机器代码之外,调试是不可能的,因为您不能
单步执行宏
这是一场维护噩梦
编译器优化人员通常不会在这方面做得很好
代码检查器在宏上不能很好地工作
MISRA和其他编译检查器将使您的代码失败
这通常是不必要的李>
你能说说为什么宏不是函数吗?为什么它需要文本替换?记住C宏是相当简单的文本替换。作为一个宏,它与效率并没有太大关系。这个宏已经非常糟糕了:它会多次计算它的参数,如果可以避免的话,就不应该这样做。内联函数更合适,并且可以避免您在跟踪虚假错误时遇到很多麻烦。您能说说为什么ERRMAP
宏不是函数吗?为什么它需要文本替换?记住C宏是相当简单的文本替换。作为一个宏,它与效率并没有太大关系。这个宏已经非常糟糕了:它会多次计算它的参数,如果可以避免的话,就不应该这样做。内联函数更合适,可以避免您在跟踪伪错误时遇到很多麻烦。我在很大程度上同意您的看法,但您不认为这在实际降低大O性能时不适用吗