【问题标题】:Does calculation in std::min() argument create computational overhead?std::min() 参数中的计算是否会产生计算开销?
【发布时间】:2017-04-28 21:40:06
【问题描述】:

假设我有一段这样的代码:

int y = 1;
int z = 1;
int x = std::min(y+1,z);

查看std::min(here)的文档,我想知道函数第一个参数中的加法是否会产生计算开销,即y+1是否可能执行两次。

我提出问题的原因是文档显示这是std::min 的可能实现:

template<class T> 
const T& min(const T& a, const T& b)
{
    return (b < a) ? b : a;
}

那么有谁知道y+1是否被执行了两次?

【问题讨论】:

  • "the documentation" 表明这两个表达式每个都只计算一次。
  • “y+1 是否可能执行两次”.. 如果min 是一个函数而不是宏,那怎么可能呢?似乎您在问这个问题是因为您在宏的情况下已经看到 “执行两次”,但不了解发生这种情况的原因 why。因为如果你理解得很好,你可能不会问这个问题。如果是这种情况,那么我建议您先了解宏观情况。
  • @Nawaz 你是绝对正确的。感谢您为我指明正确的方向。

标签: c++ c++11 std min


【解决方案1】:
template<class T> 
const T& min(const T& a, const T& b)
{
    return (b < a) ? b : a;
}

很容易看出,在这个可能实现中,min函数的每个参数只计算一次。

在您的特定情况下,临时 y + 1 绑定到 const 引用 a 并且 z 绑定到 const 引用 b。然后用ab进行计算。

从另一方面来说,宏在这个意义上更危险。

MIN宏的典型实现:

#define MIN(a, b) ((a) < (b)) ? (a) : (b)

MIN(y + 1, z)

被预处理成:

((y + 1) < (z)) ? (y + 1) : (z)

如果 y + 1 会导致 y + 1 的双重计算。

【讨论】:

  • 这是一个不好的例子,因为在这种情况下它可能不会导致双重计算,只有一个的可能性。一个更好的例子是 MIN(printf("test"), 3); 或具有无法消除的副作用的东西。
  • @DavidSchwartz 我只是尝试创建一个与问题开头提供的代码片段接近的示例。无论如何,宏示例是答案主要部分的补充。
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2014-08-18
相关资源
最近更新 更多