哪个C“MAX”宏最好?

时间:2013-03-21 09:34:32

标签: c performance optimization definition

我在C中看到了两个可能的MAX宏实现。哪个最好?

  1. define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
  2. define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))

2 个答案:

答案 0 :(得分:4)

第二个很难读,实际上已经坏了。真的很糟糕。

  1. 第二个人总是使用双打。你会得到四舍五入的错误。我当然不希望得到的结果与任何一方都不相同。
  2. 当应用于整数时,它返回一个双精度,非常令人惊讶。浮动也被提升为双倍。
  3. 如果你通过用/ 2替换* 0.5来“修复”它,那么它在其他类型上“工作”,但你会在大整数上出现意外溢出。
  4. 我还推荐函数,而不是宏,因此参数不会被评估两次。

    有时候这种棘手的版本是合适的。例如,计算恒定时间中两个整数的最大值。但它们很少见,当然不应该用作MAX的默认实现。

答案 1 :(得分:2)

第一个版本更通用,更高效,更易于理解。

第二个版本使用浮点常量,这使其特定于双精度。 它可能会返回错误的答案,因为浮点计算可能会四舍五入。 (由于二进制值无法准确表示每个可能的十进制值,例如0.1) 还涉及更多计算。 与括号的乘法不包含在括号中,这可能会导致意外的结果。

还有编译器优化的问题,但我不打算进入。