C++能保证论点评估的原子性吗?
Does C++ guarantee the atomicity of argument evaluation?
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++标准指定。
换句话说,实际的评估顺序可能是:
a(), b(), c()
c(), a(), b()
b(), a(), c()
c(), b(), a()
我只是想知道:
C++星达德能保证c()
永远不会在a()
和b()
之间被召唤吗?
我想从 C++17 开始保证。N4659(2017年3月科纳工作草案/C++17 DIS([intro.execution]/18,内容如下:
对于每个函数调用
F
,对于F
中发生的每个评估A
,以及F
内未发生但在同一线程上作为同一信号处理程序的一部分(如果有的话(计算的每个评估B
,要么A
在B
之前排序,要么B
在A
之前排序。换句话说,函数执行不会相互交错。
在 C++17 之前,我们没有这样的保证。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- C++能保证论点评估的原子性吗?
- 多核 CPU 上 32 位读取的原子性
- 保证原子性的单位操纵
- std::memory_order_relaxed 相对于同一原子变量的原子性
- 原子操作传播/可见性(原子负载与原子RMW负载)
- std::atomic如何确保原子性
- C++:标准::原子<bool>和挥发性布尔值
- 实现线程锁时是否真的需要原子性
- C++递减单字节(易失性)数组的元素不是原子!为什么?(还有:如何在Atmel AVR mcus/Arduino中强制原
- 具有易失性原子变量的原子操作
- 如何处理原子性情况
- 原子 CAS 中的后缀评估
- 我应该使用原子还是易失性指针
- 将字(32/64位)写入字符数组的原子性
- 标准 C++11 是否保证"易失性原子<T>"同时具有语义(易失性 + 原子)?
- std::shared_future操作符=线程安全性/原子性
- 顺序一致性和原子性的区别是什么?
- 什么是 C++11 原子 API 等同于"__asm__易失性( " " ::: "memory" )"''
- C++中的内存模型:顺序一致性和原子性