volatile和const的成员函数

时间:2014-09-24 19:18:52

标签: c++ volatile c++03

我遇到了这篇文章this,它试图解释volatile成员函数和const volatile成员函数。最重要的回答者说

  

将成员函数标记为const或volatile(或组合const   volatile)将这些限定符应用于此中使用的this指针   功能

以上是什么意思?将方法的this限定符标记为volatile或const volatile如何影响this指针?

我很困惑这对方法意味着什么

class foo
{
   void someMethod() volatile 
   {std::cout << "volatile method" }

   void otherMethod() const volatile 
   {std::cout << "const volatile method"}
};

1 个答案:

答案 0 :(得分:5)

如果this被标记为volatile,则会影响编译器优化远离*this指向的成员的更新的能力。

volatile的典型用例是硬件寄存器的地方 - 使用class来描述硬件寄存器并不是特别典型,但我们可以做到。

例如,可以有一个这样的类:

class my_hardware_device
{
  public:
    int32_t reg1; 
    int32_t reg2;
  private:
    int32_t reserved;
  public:
    int32_t reg4;
    int func() volatile;
};

volatile my_hardware_device hw1 = 
   reinterpret_cast<volatile my_hardware_device*>(0x10000000); 
...
int my_hardware_device::func() volatile
{ 
    reg2 = 3;
    reg3 = 8;
    reg2 = 7;
    if (reg2 == 4)
    {
       ...
    }
}

...
hw1->func();

如果没有volatile,编译器可以很好地决定删除reg2 = 3并确定reg2 == 4始终为false,因为reg2 = 7;。但由于它实际上指向某些硬件,因此它的行为与编译器的预期不同。 [这是一个非常愚蠢的例子,只是为了展示它是如何工作的 - 我不是暗示这对于任何这样的硬件接口都是一个“正确”或“好”的解决方案 - 更不用担心可移植性问题,以及所有方式其他的东西 - 当然,如果你试图用虚拟功能,vtable会造成完全的破坏 - 如果你正在处理驱动程序中的硬件,你可能确实希望vtables解决硬件变种,给出另一个原因以不同的方式实现这种代码。]

const变体意味着不允许编译器写入*this的成员(换言之,示例中的类foo中的成员),除非它们被标记作为mutable(或者如果使用const_cast来抛弃常量 - 顺便说一句,const_cast也可用于抛弃波动性。

constvolatile组合在一起只是意味着无法优化读取,并且不允许编译器更新*this的成员。