C++ volatile

    xiaoxiao2022-07-07  148

    volatile与机器有关,只能通过阅读编译器文档理解。

    (1)violate变量不允许编译器优化。

    这就使得编译器不会改变指令执行顺序,在多线程中特别有用,例如双检锁的数据竞争问题。

    volatile后面的变量,是常变量,会直接访问地址,如果没有这个关键字,就可能会暂时使用寄存器的值,而不是读取地址。

    在并发读取的时候,寄存器读出来的值不一定是最新的。https://blog.csdn.net/ijn842/article/details/81273232

    https://blog.csdn.net/u010879456/article/details/53705089

    参见:https://blog.csdn.net/wpb92/article/details/76714329

    (2)合成的拷贝对volatile对象无效。

    因为合成的拷贝/移动/赋值函数的参数是常量引用,显然不能把一个非volatile引用绑定到volatile对象上。

    如果一个类要拷贝/移动/赋值它的volatile对象,那么需要自定义其对应的拷贝或移动操作。

    class Foo{ public: // 从一个volatile对象拷贝 Foo(const volatile Foo&); // 将一个volatile对象赋值给一个非volatile对象 Foo& operator=(const volatile Foo&); // 将一个volatile对象赋值给一个volatile对象 Foo& operator=(volatile const Foo&) volatile; };

    但是,拷贝一个volatile对象是否有意义呢?这要视具体情况而定。

     

    参考:《C++ Primer》

    最新回复(0)