首页
学习
活动
专区
工具
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中为什么不推荐使用Float

在Java中为什么不推荐使用Float 在Java中,我们可以使用两种数据类型来表示浮点数:Float和Double。...综上所述,尽管在某些特定情况下可以使用Float类型,但在大多数工作中的场景中,推荐使用Double类型来处理浮点数计算,以获得更高的精度和更好的数学函数支持。...下面是几个在工作中常见的案例,说明为什么在Java中不推荐使用Float类型: 1. 金融计算 在金融领域,精确的计算是至关重要的。例如,计算利息、股票价格或货币兑换时,需要高精度的计算。...地理位置计算 在地理位置计算中,需要进行浮点数运算来计算距离、坐标等。使用Float类型可能会导致精度丢失,从而产生不准确的结果。因此,推荐使用Double类型来进行地理位置计算,以获得更高的精度。...因此,推荐使用Double类型来进行科学计算,以获得更高的精度和准确性。

7910

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

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

3K20
  • 什么是线程组,为什么在 Java 中不推荐使用?

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

    32520

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

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

    1.6K30

    关于 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限定符,取首字母嘛。...因为假设编译器发现程序在几条语句中都使用了某个变量,那么为了优化,它不会让程序去查多次,而是缓存到寄存器中。

    63410

    【错误记录】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

    23910

    C++中volatile限定符详解

    volatile是 C 和 C++ 中的一个类型限定符,它用于告诉编译器被修饰的变量具有特殊的属性,编译器在对该变量进行优化时需要特殊对待。以下是volatile限定符的主要作用: 1....volatile关键字可防止编译器对涉及该变量的代码进行某些优化,以确保程序每次都从内存中读取volatile变量的值,而不是使用可能已缓存的值。...多线程共享变量(有一定局限性) 在多线程环境中,虽然volatile可以在一定程度上保证对变量的可见性,但它并不能替代互斥锁等同步机制。...对于简单的标志位等共享变量,volatile可以确保一个线程对变量的修改能被其他线程及时看到。然而,对于更复杂的共享数据结构,仅仅使用volatile是不够的,因为它不能解决诸如数据竞争等问题。...总的来说,volatile限定符主要用于处理在程序控制流之外可能改变值的变量,确保程序与这些特殊变量交互的正确性,但在复杂的并发场景中需要结合其他机制来保证数据的一致性和正确性。

    9310

    【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++中还可以使用

    11410

    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对指令的调优。

    29330

    【C语言】数据类型全解析:编程效率提升的秘诀

    类型限定符 类型限定符用于修改基本数据类型的属性,常见的类型限定符包括const、volatile、signed和unsigned。 3.1 const限定符 const限定符表示变量的值不可修改。...限定符 volatile限定符表示变量的值可能在程序控制之外被修改,编译器不会对其进行优化。...扩展技巧 在实际编程中,选择和使用数据类型的技巧对于提高程序的效率和可维护性非常重要。...以下是一些常见的扩展技巧: 5.1 使用定长数据类型 为了确保不同平台上的数据一致性,可以使用标准库中的定长数据类型,例如int8_t、uint8_t、int16_t、uint16_t等。...在嵌入式系统中,合理地使用结构体和内存对齐技术可以显著提高内存访问效率。

    23011

    C++转型操作符 VS 强制类型转换:为何前者更胜一筹?

    常被滥用于奇怪的转换和位操作,C++20 引入的 std::bit_cast 是更好选择。...示例:int num = 10;double* ptr = reinterpret_cast(&num); 1.5 C++20 中的 std::bit_cast主要用途:将源对象的位和字节直接复制到目标类型的对象中...要求源对象和目标对象必须大小相同且是平凡可复制的,声明在 头文件中。若无法使用 C++20,可用 memcpy 实现类似功能。...2.3 精确性C++的转型操作符更精确,例如 const_cast 专门用于修改 const 或 volatile 属性,C 风格强制类型转换无法实现此功能,可减少类型转换错误。...+的转型操作符在可读性、安全性和精确性方面优于 C 风格的强制类型转换,虽可能稍复杂,但可清晰表达程序员意图,减少类型转换错误,提高代码质量、可维护性,减少运行时错误,使程序更健壮,建议在 C++编程中优先使用

    8300

    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版本发布 ---- 看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢!

    54120

    万字长文带你掌握C++11中auto和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++返回值类型后置(跟踪返回值类型) 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。

    62910

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

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

    90120

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

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

    2.9K20
    领券