C 哪种代码更有效?对一个宏调用两次,还是将宏赋给一个变量并使用两次?

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 )) ? \

从下面的“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 ));
        }
//我正在用这个宏执行一些操作。
#定义错误映射(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性能时不适用吗