volatile和const的成员函数

Raj*_*war 1 c++ volatile c++03

我碰到这个帖子其中试图解释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"}
};
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 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();
Run Code Online (Sandbox Code Playgroud)

如果没有volatile,编译器可以很好地决定删除reg2 = 3并确定reg2 == 4始终为false,因为reg2 = 7;.但由于它实际上指向某些硬件,因此它的行为与编译器的预期不同.[这只是构建以显示它如何能工作的一个很愚蠢的例子-我不是暗示,这是一个"正确"或"好"任何这样的硬件接口解决方案的任何手段-没关系便携性的问题,所有的方式其他的东西 - 当然,如果你试图将它与虚函数一起使用,那么vtable会造成彻底的破坏 - 如果你正在处理驱动程序中的硬件,你可能确实希望vtables解决硬件变体,给出另一个原因以不同的方式实现这种代码.]

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

二者相结合的constvolatile简单地意味着读取不能被优化掉,并且编译器不允许更新的成员*this.