哪个代码更有效?调用两次宏或只是将宏分配给变量并使用它两次?

时间:2013-09-06 04:48:01

标签: 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 )) ? \
                         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 ));
        }

3 个答案:

答案 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,所以你可以解决它。

顺便说一句 - 你应该只考虑做这种宏,(比如函数),如果你尝试过使用一个函数,你的探查器已经说过这是主要原因之一你的代码太大或太慢。原因:

  1. 宏中的错误很难让编译器报告其位置 - 您有5行,最多80个字符,但只会在您“调用”代码的地方报告任何编译器错误。
  2. 您正在击败类型检查,这是C / C ++的主要好处之一
  3. 除了机器代码之外的调试是不可能的,因为你不能 逐步通过宏。
  4. 这是一场维护噩梦。
  5. 编译器优化器通常不会很好。
  6. 代码检查程序无法在宏上运行良好
  7. MISRA和其他编译检查程序将使您的代码失败。
  8. 通常没必要!