专栏首页C++核心准则原文翻译C++核心准则CP.200:使用volatile只能表明该变量是非C++内存

C++核心准则CP.200:使用volatile只能表明该变量是非C++内存

CP.200: Use volatile only to talk to non-C++ memory

CP.200:使用volatile只能表明该变量是非C++内存

Reason(原因)

volatile is used to refer to objects that are shared with "non-C++" code or hardware that does not follow the C++ memory model.

volatile用于表明参照的对象需要和非C++代码或硬件共享而遵守C++内存模型。

Example(示例)

const volatile long clock;

This describes a register constantly updated by a clock circuit. clock is volatile because its value will change without any action from the C++ program that uses it. For example, reading clock twice will often yield two different values, so the optimizer had better not optimize away the second read in this code:

这段代码描述一个不断被时钟电路更新的寄存器。clock被定义为volatile是因为它的值在使用它的C++程序没有任何动作的情况下被修改。例如,两次读取clock经常可以得到不同的值,因此优化器最好不要优化掉这段代码中的第二个读操作。

long t1 = clock;
// ... no use of clock here ...
long t2 = clock;

clock is const because the program should not try to write to clock.

clock定义为常量是为了表明程序不应该对clock进行写操作。

Note(注意)

Unless you are writing the lowest level code manipulating hardware directly, consider volatile an esoteric feature that is best avoided.

除非你正在编写直接操作硬件的低层次代码,否则将volatile作为冷门功能并最好避免使用。

Example(示例)

Usually C++ code receives volatile memory that is owned elsewhere (hardware or another language):

通常情况下,C++代码接受有其他某处拥有的volatile内存(硬件或其他语言):

int volatile* vi = get_hardware_memory_location();
    // note: we get a pointer to someone else's memory here
    // volatile says "treat this with extra respect"

Sometimes C++ code allocates the volatile memory and shares it with "elsewhere" (hardware or another language) by deliberately escaping a pointer:

某些C++代码会分配volatile内存并通过故意泄露指针的方式和其他部分共享(硬件或其他语言)它。

static volatile long vl;
please_use_this(&vl);   // escape a reference to this to "elsewhere" (not C++)
Example, bad(反面示例)

volatile local variables are nearly always wrong -- how can they be shared with other languages or hardware if they're ephemeral? The same applies almost as strongly to member variables, for the same reason.

volatile类型的局部变量几乎一定是错的--如果它们只能短期存在,怎么能分享给其他语言或硬件呢?由于同样的原因,该原则也几乎一定适用于成员变量。

void f()
{
    volatile int i = 0; // bad, volatile local variable
    // etc.
}

class My_type {
    volatile int i = 0; // suspicious, volatile member variable
    // etc.
};
Note(注意)

In C++, unlike in some other languages, volatile has nothing to do with synchronization.

和其他语言不同,在C++中不会为同步做任何事情。

Enforcement(实施建议)
  • Flag volatile T local and member variables; almost certainly you intended to use atomic<T> instead.
  • 标记volatile类型的局部变量和成员变量;几乎可以肯定的说你想用的其实是atomatic<T>。
  • ???

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#cp200-use-volatile-only-to-talk-to-non-c-memory

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则C.1:组织相关数据形成结构体或者类

    Ease of comprehension. If data is related (for fundamental reasons), that fact s...

    面向对象思考
  • C++核心准则T.65:使用标签分发提供函数的不同实现

    T.65: Use tag dispatch to provide alternative implementations of a function

    面向对象思考
  • C++核心准则CP.24:将线程看作全局​容器

    CP.24: Think of a thread as a global container

    面向对象思考
  • Java 理论与实践: 正确使用 Volatile 变量

    Java 语言中的 Volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变...

    哲洛不闹
  • 围绕一个 volatile 关键字居然可以问出来 16 个问题

    对于 Java 每次面试就会想到多线程,多线程问题基本跑不了要问一下 volalite 关键字,可是我万万没想到居然一个 volatile 关键字可以连续问题出...

    Java团长
  • C++雾中风景13:volatile解惑

    volatile这个单词在英文之中的意思是:易变的,不稳定的的含义。所以顾名思义,一旦变量通过了volatile关键词修饰之后,说明变量是易变的和不稳定的。而C...

    HappenLee
  • Java程序员面试必备:Volatile全方位解析

    volatile是Java程序员必备的基础,也是面试官非常喜欢问的一个话题,本文跟大家一起开启volatile学习之旅,如果有不正确的地方,也麻烦大家指出哈,一...

    捡田螺的小男孩
  • 每个学习多线程的Java程序员都必须掌握的volatile关键字解析

    volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchro...

    Java_老男孩
  • 【不要再背】volatile的可见性和原子性

    volatile保证可见性的原理是在每次访问变量时候都会进行一次刷新,因此每次访问都是准没存中最新的版本,所以volatile关键字的作用之一就是保证变量修改的...

    用户4143945
  • volatile关键字解析~高级java必问

    昨天我介绍了原子性、可见性、有序性的概念,那么今天就来见识下这些概念的主角-volatile关键字。 volatile基本介绍 volatile可以看成是syn...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券