可变和常量的成员函数

Member functions that are volatile and const

本文关键字:成员 函数 常量      更新时间:2023-10-16

我在这篇文章中看到了这篇文章,它试图解释volatile成员函数和const volatile会员函数。最高回答者表示

将成员函数标记为const或volatile(或组合constvolatile)将这些限定符应用于功能

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

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

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

如果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始终为假,这两者都是因为reg2 = 7;。但由于它实际上指向某些硬件,它的行为与编译器预期的不同。[这是一个非常愚蠢的例子,只是为了展示它是如何工作的——我绝不是在暗示这是"正确的"或"好的"任何此类硬件接口的解决方案-更不用说便携性问题和其他各种问题了-当然,如果你试图将vtable与虚拟功能一起使用,vtable会造成彻底的破坏-如果你在驱动程序中处理硬件,你可能确实希望vtable解决硬件变体,给出了以不同方式实现这类代码的另一个原因。]

const变体意味着编译器不允许写入*this的成员(换句话说,在您的示例中是类foo中的成员),除非它们被标记为mutable(或者如果const_cast用于丢弃常量-顺便说一句,const_cast也可以用于丢弃挥发性)。

constvolatile组合起来只是意味着读取不能被优化掉,并且编译器不允许更新*this的成员。