首页 > 解决方案 > 在 C++20 中增加一个 volatile 并弃用对 volatile 的操作

问题描述

volatileC++20 弃用了对类型的某些特定操作(在P1152 之后)。

以下代码在 C++20 之前有效:

void busyLoop(std::size_t count) {
  for (volatile size_t counter = 0; counter < count; ++counter);
}

现在生成一个弃用警告:

warning: '++' expression of 'volatile'-qualified type is deprecated [-Wvolatile]

更改++to+=或 tocounter = counter + 1没有帮助,因为问题似乎在于基于 volatile 类型计算新值。

如何将上述代码调整为新的 C++20 规则?

标签: c++deprecatedvolatilec++20

解决方案


弃用这些操作的目的是要明确volatile变量不是原子的,也不应该期望被原子地操作。因此,对于任何使用 的实际代码volatile,您需要将值读入本地,操作该本地副本,然后将值写回该volatile值。

这种访问模式旨在模仿委员会希望将其编入基于函数的接口,该接口将(也许?)volatile在某个时候完全取代。也就是说,volatile成为您在加载和存储时访问内存地址的一种方式;它不会是对象的内在属性。


推荐阅读