首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++20中是否不推荐使用volatile限定符?

在C++20标准中,对volatile关键字的使用进行了一些调整,但并没有明确不推荐使用它。在C++中,volatile关键字用于告诉编译器,该变量可能会被意外地修改,因此编译器不应该进行某些优化。

然而,在C++20中,volatile的用途受到了限制,因为它只能用于以下几种情况:

  1. 与信号处理器共享的全局变量。这些变量可能在程序执行期间被信号处理器修改,因此使用volatile关键字可以确保每次访问都从内存中读取最新的值。
  2. 多线程编程中与std::atomic类型一起使用的变量。volatile用于确保对变量的修改在线程间可见。
  3. 在特殊硬件或低级编程领域中使用。例如,嵌入式系统或设备驱动程序可能会使用volatile来访问特殊硬件寄存器。

对于一般的应用开发,volatile的使用并不常见。相反,C++20引入了更强大且更安全的原子类型和操作,如std::atomic,用于多线程编程和并发操作。

总结起来,虽然C++20并没有直接推荐不使用volatile关键字,但它的用途已经受到限制,不再适用于一般的应用开发场景。在多线程编程中,更推荐使用std::atomic类型来确保线程安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为啥 Java 推荐将 Optional 当做参数使用

一、背景 最近开发过程,身边的同事为了实现逻辑复用,定义一个私有公共方法实现逻辑复用,定义函数签名时将上游的 Optional 作为参数传递。 IDEA 给出警告,但是并没有讲清楚为什么。...那么,为什么推荐作为参数使用呢? 二、讨论 2.1 为什么不要将 Optional 作为参数 如果将 Optional 当做参数使用,那么本身可传递 null, 依然需要进行判空再使用。...,参数是方法调用 Supplier 也违规,又契合将调用传递的目的。...三、结论 【建议】建议将 Optional 作为参数,容易造成空指针和误解,这和 Optional 的目的相违背。如果是想传递某个调用,请使用 Supplier。...【建议】建议将 Optional 作为属性,非要用建议使用 guava 包的 Optional 类。

2.9K20

什么是线程组,为什么在 Java 推荐使用

在线程组,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。 在 Java ,虽然线程组是一种功能强大的机制,但实际上并不推荐使用。...在实践,像 Executor 这样的 API 已经为线程管理提供了更加强大、可控的解决方案,相比之下,线程组已经逐渐退出 Java 中被广泛使用的范畴。...考虑到大多数应用场景都需要进行动态调度,而且现代的 JDK 版本已经增加了类似 CompletableFuture、CompletionService 等更高级且易维护的机制,因此使用线程组会带来更多的限制而不是优势...3、容易引起歧义 在 Java ,虽然 ThreadGroup 的设计旨在通过将一组线程分到同一个容器来轻松管理和控制它们,但如果使用错误,可能会导致线程状态。...因此,在 Java ,线程组已基本过时,推荐使用 Executor 框架等新的更实用的工具来进行线程管理。

30220
  • Java 为什么推荐在 while 循环中使用 sleep()

    前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...方案是否合理记住一点,讨论方案永远不能脱离场景,没有一种方案可以适应所有的场景,我们永远只是在探讨适合当前场景的方案。...比如微服务体系,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...事件机制上文的场景,我更推荐事件机制进行解耦,当变量被改变时,发送变量修改事件进行处理,如常见的 Spring Event 或者其它事件推送框架。...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

    1.3K30

    关于 java 的 set,get方法,而为什么推荐直接使用public

    我不知道有没有人遇到过,有一段时间,我都觉得那些 set,get的用处何在,我直接写一个public直接拿不就行了,多爽,但是随着使用的频繁,越来越想去搜索一下这个问题,而不是按照官方的推荐,前辈们的使用都是建议...这里引入其中的一句话: 在任何相互关系,具有关系所涉及的各方都遵守的边界是十分重要的事情,当创建一个类库时,就建立了与客户端程序员之间的关系,他们同样也是程序员,但是他们是使用你的类库来构建应用...即使你希望客户端程序员不要直接操作你的类的某些成员,但是如果没有任何访问控制,将无法阻止此事发生。所有的东西都将赤裸裸的暴露在世人面前。...综上所述,写到这里,我诞生了一个想法,其实set ,get ,public,对于它们使用完全取决于我们程序员自己,为了让项目之间的逻辑更加清晰,有些标准自上而下,慢慢的传了下来,无论你使用那种,但是有一个东西是无法避免的...补充说明,set字面意思设置,get获取,我们了解一下java面向对象编程的封闭性与安全性,private 修饰的set get方法将方法封闭在了一个特定类,其他类就无法对其变量进行方法,这样就提高了数据的安全性

    1.5K20

    C++变量的存储说明符和cv-限定符

    在C++创建变量时,前面有时会有一些修饰符,这里总结一下。 大体分为两个类别:存储说明符和cv-限定符。...(int n) { static int count = 0;// 在函数内用static声明,只能在函数内使用,但是无论函数是否执行,变量都存在,且多次调用时其值不会重新初始化,而是保持上一次的结果...int lama = 0;// 普通变量,只能在函数内使用,函数执行就不会存在 } 函数内创建与外部静态变量同名的变量时,将使用自己创建的,但是可以用::操作符表示使用外部的: int global...cv限定符只有两种: const volatile 这也是为什么它叫cv限定符,取首字母嘛。...因为假设编译器发现程序在几条语句中都使用了某个变量,那么为了优化,它不会让程序去查多次,而是缓存到寄存器

    62110

    【错误记录】set 集合容器仿函数报错 ( 具有类型“const IntCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool IntCompare::oper“ )

    是 C++ 的两个关键字 , 它们通常用于修饰变量或函数 ; 这两个限定符的作用和用途不同 , 但在某些情况下可以一起使用 ; const 关键字用于表明某个变量的值不能被修改 ; 它可以修饰变量、...指针、数组等 ; volatile 关键字告诉编译器这个变量可能会在任何时刻被外部因素(如操作系统或其他进程)改变 ; 因此,编译器不会对该变量进行优化 ; 当 const 和 volatile 一起使用时..., const-volatile 限定符 , 它们表示这个变量是常量并且可能会被外部因素改变 ; 报错信息说明 , 调用 bool IntCompare::operator ()(const int...&,const int &) 函数时 , 可能会丢失 const-volatile 限定符 ; 使用 const volatile 修饰这个函数 ; 修改后的仿函数如下 : struct IntCompare...解决方案 使用 const volatile 修饰 bool operator()(const int& a, const int& b) 函数 ; 修改后的代码为 : struct IntCompare

    21410

    【C++高阶】C++类型转换全攻略:深入理解并高效应用

    恰当的类型转换可能导致数据丢失、程序崩溃乃至未定义行为,严重影响程序的稳定性和安全性。...C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化 C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换...(a); return 0; } ⭐const_cast const_cast用于去除类型的const或volatile限定符。...限定符,当让我们也可以只用C语言的形式进行强制转换 代码示例 (C++): int main() { volatile const int a = 2; //int* p = (int* )(&...强制类型转换的原因 C风格的转换格式很简单,但是有不少缺点的:比如数据精度丢失,显式类型转换将所有情况混合在一起,代码不够清晰,所以C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++还可以使用

    10410

    volatile关键字的使用

    MSDN手册volatile关键字的解释: 大概的翻译: volatile关键字是一个类型限定符,用于声明一个对象可以通过其他语句(例如操作系统、硬件或并发执行的线程)在程序中进行修改...应用在多线程 int gdata=10;//全局变量 int fun(){ gdata=20; } thread1线程1{ fun(); } thread2线程2{ int a...ptr[c],eax int c=gdata;//mov dword ptr[c],eax //为了优化指令,编译器认为两次赋值中间没有对gdata进行赋值 //第二次对c赋值使用...,可以加volatile关键字,防止寄存器 //存储变量的副本值 } 指令的调优 1.编译器对指令的调优 使用volatile关键字 void fun(int *a){*a=10;int b...但是如果程序员希望发生顺序的调优,则可在可能发生调优的上下程序段之间添加barrier();以防止CPU对指令的调优。

    28930

    C++ 动态新闻推送 第33期

    C++ 动态新闻推送 第33期 从reddit/hackernews/lobsters/摘抄一些c++动态 这周周末有事,发的比较早 周刊项目地址|在线地址 |知乎专栏 腾讯云+社区 欢迎投稿,推荐或自荐文章.../软件/资源等,请提交 issue ---- 资讯 编译器信息最新动态推荐关注hellogcc公众号 OSDT Weekly 2021-10-13 第119期 QT 6出beta版本了 文章 From...暗示会变,让编译器优化,AssemblerTemplate是空的,也就是明显是空的无作用的汇编也不要删掉?...没啥说的 Runtime Reflection in C++ 介绍一种reflect实现,还是传统的宏+记录类型信息 项目 weggli rust写的一个程序,能够搜索代码的代码块。...不过搁置了 ttauri 一个c++20 GUI库 CrowCpp 是一个c++ http库框架,0.3版本发布 ---- 看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢!

    53220

    万字长文带你掌握C++11auto和decltype的用法和区别

    auto 用于泛型编程 auto 的另一个应用就是当我们不知道变量是什么类型,或者希望指明具体类型的时候,比如泛型编程。...2、对 cv 限定符的处理 「cv 限定符」是 const 和 volatile 关键字的统称: const 关键字用来表示数据是只读的,也就是不能被修改; volatile 和 const 是相反的,...以下是 auto 关键字对 cv 限定符的推导规则: 如果表达式的类型不是指针或者引用,auto 会把 cv 限定符直接抛弃,推导成 non-const 或者 non-volatile 类型。...从代码是否健壮的角度考虑,我推荐使用 decltype,它没有那么多是非;但是 decltype 总是显得比较麻烦,尤其是当表达式比较复杂时,例如: vector nums; decltype(nums.begin...如果你的表达式类型不复杂,我还是推荐使用 auto 关键字,优雅的代码总是叫人赏心悦目,沉浸其中。 四、C++返回值类型后置(跟踪返回值类型) 在泛型编程,可能需要通过参数的运算来得到返回值的类型。

    54410

    教科书不会讲的C语言关键字volatile用法

    在C/C++嵌入式代码,你是否经历过以下情况: 代码执行正常–直到你打开了编译器优化 代码执行正常–直到打开了中断 古怪的硬件驱动 RTOS的任务独立运行正常–直到生成了其他任务 如果你的回答是“yes...你并不是唯一的,很多程序员都不能正确使用volatile。不幸的是,大多数c语言书籍对volatile的藐视,只是简单地一带而过。 volatile用于声明变量时的使用限定符。...在程序循环查看该状态寄存器的值是否变为非0。 下面是最容易想到,但错误的实现方法: 当你打开编译器优化时,程序总是执行失败。...中断服务程序 在中断服务程序,经常会修改一些全局变量值,来作为主程序的判断条件。例如,在串口中断服务程序,可能会检测是否接收到了ETX(假如是消息的结束标识符)字符。...相反,我常常看到程序员们错误的使用volatile。 如果你被要求去修改一个很古怪的代码,请在程序查找一下volatile关键字;如果你什么也没有找到,上面讨论的例子可以向你提供一些解决问题的思路。

    84320

    GCC在C语言中内嵌汇编-转载

    4、限制字符 4.1、限制字符列表 限制字符有很多种,有些是与特定体系结构相关,此处仅列出常用的限定字符和i386可能用到的一些常用的限定符。...使用"volatile"也可以达到这个目的,但是我们在每个变量前增加该关键字,不如使用"memory"方便 关于编译器优化的两个类型限定词:volatile和restrict http://www.diybl.com...但编译器并不会验证你定义为restrict的指针,是否真正是某个数据的唯一访问途径;就像数组的下标越 界一样,如果你遵守规则,编译器并不会指出错误,但后果由你自己负责:) 同样看个有趣的类子...对于优化来说,volatile是强制性,而restrict是建议性。也就是加了volatile则强制不进行优化,而加入restrict编译器也 一定肯定优化。...同时也告诉调用 者仅使用满足restrict定义条件的参数,如果你遵守,嘿嘿。。。

    2.9K20

    C++打怪升级(一)- 命名空间、缺省形参、重载

    域作用限定符:: scope::tag 两个操作数:左操作数是指定的一个域,右操作数是一个标识符(变量、函数名等) 使用域作用限定符访问命名空间中的成员**:** #include <iostream...前面已经介绍了使用域作用限定符访问命名空间中成员的方法,接下来我们来看看另外两种访问命名空间成员的方法吧!...---- 使用关键字using将命名空间某个成员引入 又称为命名空间的部分展开; 引入该成员后,就可以直接使用该成员了,不需要再用域作用限定符了(当然用了也不会出错)。....h; 旧编译器(如vc 6.0)还支持格式,后续编译器已不支持,因此推荐使用+std的方式 。...只有返回值类型不同,构成重载,因为在函数调用时无法区分要调用哪一个函数,产生了二义性。 那么,有一个问题:C++函数返回值类型可以用来修饰函数名吗?

    87320

    Modern C++,学炸了!!

    C++ 面向对象语法 访问限定符 public/protected/private 构造函数/析构函数/拷贝构造 多态 虚函数与纯虚函数、虚函数实现机制、虚函数表 继承原理、虚继承、菱形继承 new/...但是上面的公式,在一个逗号表达式 auto __begin = begin-expr, __end = end-expr; 由于只使用了一个类型符号 auto 导致起始迭代子 __begin 和结束迭代子...__end 是同一个类型,这样不太灵活,在某些设计,可能希望结束迭代子是另外一种类型。...这部分内容节选自《C++ 服务器开发精髓》一书: 4.4 C++20 的改动 C++20 进一步弥补 C++ 这门语言的“功能不完备性”,所谓“功能不完备性”,即与 Java/Go 等语言相比,C++...程序的一些功能(如文件操作、协程等)需要直接调用操作系统的 API ,而不像其他语言自带 SDK,这样对于要求多平台运行的程序,必须使用宏定义分别编写一套。

    3.2K10

    C++ 中文周刊 第99期

    C++ 中文周刊 第99期 周刊项目地址 ---- 资讯 标准委员会动态/ide/编译器信息放在这里 编译器信息最新动态推荐关注hellogcc公众号 2023-02-01 第187期 有武汉线下活动,...Practices jetbrains出的报告,关于c++20使用,编译工具cmake使用率,代码分析使用率做了个列举,这里直接贴一下 构建工具,cmake越来越普及,虽然难用 什么?...甚至写测试 使用什么代码分析工具? 嘻嘻,甚至不用分析工具 完整报告可以去他们官网看。...WithAppender(GetAnotherSpecialAppenderParams());         }).         // ...         .Build(); } 来个现实生活的例子...is_layout_compatible_v); static_assert(std::is_layout_compatible_v<const int, int const volatile

    51630
    领券