1

从下面的“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 ));
        }
4

3 回答 3

3

如果没有先进行某种重要的测量,请不要担心“最有效”。“高效”也可能意味着许多不同的东西。在执行时间方面有效吗?代码大小?内存使用情况?“高效”不是“最快”的同义词。

与其担心哪种方式最快,不如考虑哪种方式最清晰。最昂贵的时间是程序员时间。

于 2013-09-06T05:00:21.837 回答
1

想必A_ABS也是宏之类的功能!基本技巧是在您的脑海中将其计算为伪机器代码 - 假设它A_ABS具有相似的复杂性并且不再调用任何东西 - 然后我会将它们中的每一个放在大约 20 个操作码中,总共 40 个 -使用它们并分配一个值,然后使用该值两次将是 42 - 而“调用”两次将是 80,所以你可以解决。

顺便说一句- 如果您尝试使用函数并且您的分析器说这是您的代码太大或太慢的主要原因之一,您甚至应该只考虑执行这种宏(即类似函数)。原因:

  1. 宏中的错误很难让编译器报告其位置 - 您有 5 行最多 80 个字符,但任何编译器错误只会在您“调用”代码的地方报告。
  2. 您正在击败类型检查,这是 C/C++ 的主要优点之一
  3. 除了机器代码之外的调试是不可能的,因为您无法单步执行宏。
  4. 这是维护的噩梦。
  5. 编译器优化器通常不会做得很好。
  6. 代码检查器不能很好地处理宏
  7. MISRA 和其他编译检查器将使您的代码失败。
  8. 通常是不必要的!
于 2013-09-06T05:19:57.453 回答
1

不要这样做:

int some_fun (int sts) {
    printf(" sts = %d", ERRMAP( sts ));
    return (ERRMAP( sts ));
}

有一天,如果修改 ERRMAP 以产生副作用,您将在打印和返回的内容之间得到不同的结果。

做一次计算也是一个好主意。无论 ERRMAP 是函数还是宏,这都是最好的:int i = ERRMAP( sts );

于 2013-09-06T04:51:16.823 回答