C++ 在C+中增加一个volatile+;20,对volatile的操作已被弃用

C++ 在C+中增加一个volatile+;20,对volatile的操作已被弃用,c++,deprecated,volatile,c++20,C++,Deprecated,Volatile,C++20,C++20不赞成对volatile类型(以下)执行某些操作 以下代码在C++20之前有效: void busyLoop(std::size_t count) { for (volatile size_t counter = 0; counter < count; ++counter); } 将++更改为++=或计数器=计数器+1没有帮助,因为问题似乎是基于易失性类型计算新值 如何将上述代码调整为新的C++20规则?如问题中所示,增加volatile时,在C++20中不推荐使用,您可以

C++20不赞成对
volatile
类型(以下)执行某些操作

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

void busyLoop(std::size_t count) {
  for (volatile size_t counter = 0; counter < count; ++counter);
}
++
更改为
++=
计数器=计数器+1
没有帮助,因为问题似乎是基于易失性类型计算新值


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

如问题中所示,增加
volatile
时,在C++20中不推荐使用,您可以增加非volatile类型,并将结果分配回
volatile
类型

以下内容在C++20中有效:

void busyLoop(size_t count) {
  size_t i = 0;
  for ([[maybe_unused]]volatile size_t counter = 0; i < count; counter = i, ++i);
}
void busylop(大小\u t计数){
尺寸i=0;
对于([[maybe_unused]]volatile size_t counter=0;i
不推荐这些操作的目的是要清楚地表明,
volatile
变量在任何方面都不是原子的,不应被期望以原子方式操作。因此,对于使用
volatile
的任何实际代码,您需要将值读入本地,操作该本地副本,然后将值写回
volatile


这种访问模式旨在模仿委员会希望编纂成一个基于功能的界面,该界面(可能?)将在某个时候完全取代
volatile
。也就是说,
volatile
成为在加载和存储时访问内存地址的一种方式;它不是对象的固有属性。

counter=counter+1
是正确的(只要该代码是可取的)。它的警告是一个GCCbug:它应该只对
reg=vol=1
可能会也可能不会将1分配给
reg
。(即使写入
void(counter=counter+1)
也没有帮助。)

您是否检查过确实需要从
volatile
开始?在我的日子里,我见过(也做过)很多繁忙的等待循环,但从未见过(或需要使用)
volatile
@Someprogrammerdude这只是一个展示C++20中所做的弃用的最小示例。无论如何,特别是对于这个确切的情况:=2µs,=27779µs,时间也有变化,尽管由于一些未知的原因时间受影响较小。从标准的角度来看,没有什么可调整的。“弃用”的意思是“将来可能会消失”。在弃用之前有效的代码仍然有效,并且其含义没有更改。这会使计数器获取错误的值。也就是说,它得到的值与原始代码得到的值不同。如果由于某种原因,
volatile
在本例中确实很重要,那么
volatile
值的接收者将以错误的顺序获取值。@Nicolas修复,谢谢。尝试搜索gcc的bugzilla无法找到是否提交了该错误。你知道是有一个bug已经打开了还是我应该打开一个?@AmirKirsh:我还没看。我只知道这是特定于案例的
;它不会在独立语句中发出警告。可能是因为无法将该上下文识别为被丢弃的值表达式。
void busyLoop(size_t count) {
  size_t i = 0;
  for ([[maybe_unused]]volatile size_t counter = 0; i < count; counter = i, ++i);
}