【问题标题】:Does C++ guarantee the atomicity of argument evaluation?C++ 是否保证参数评估的原子性?
【发布时间】:2020-06-10 07:32:01
【问题描述】:
int a()
{
    return 1;
}

int b()
{
    return 2;
}

int c()
{
    return 3;
}

int g(int, int)
{
    return 0;
}

void f(int, int)
{}

int main()
{
    f(g(a(), b()),
      c());
}

我知道根据 C++ 标准未指定函数参数的评估顺序。

换句话说,实际的评估顺序可能是:

  1. a(), b(), c()
  2. c(), a(), b()
  3. b(), a(), c()
  4. c(), b(), a()

我只是想知道:

C++ 标准是否保证c() 永远不会在a()b() 之间被调用?

【问题讨论】:

  • 一个参数的计算不会与同一个调用中另一个参数的计算重叠。但求值并不是通常意义上的原子,因为在不同线程中求值的表达式可能会重叠。
  • 我们不应该将标题中的“原子性”替换为“顺序”,以便标题和问题正文匹配吗?

标签: c++ function arguments standards


【解决方案1】:

我猜它是从 C++17 开始保证的。 N4659(2017 年 3 月 Kona 后工作草案/C++17 DIS)[intro.execution]/18,reads

对于每个函数调用 F,对于在 F 内发生的每个评估 A 以及在 F 内不发生但在同一线程上评估并作为同一线程的一部分的每个评估 B信号处理程序(如果有),AB 之前排序或BA 之前排序。换句话说,函数执行不会相互交错。

在 C++17 之前,我们没有这样的保证。

【讨论】:

  • 在您撰写本文时,这是在 C++17 中引入的;我可以建议将标准链接从当前工作草案(C++2a,WIP)替换为 N4659(2017 年 3 月 Kona 工作草案/C++17 DIS)吗? N4659: [intro.execution]/18.
猜你喜欢
  • 2018-11-20
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2015-07-04
相关资源
最近更新 更多