【问题标题】:Member functions that are volatile and constvolatile 和 const 的成员函数
【发布时间】:2014-09-24 19:18:52
【问题描述】:

我遇到了这篇文章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"}
};

【问题讨论】:

标签: c++ volatile c++03


【解决方案1】:

如果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 会造成彻底的破坏——如果你在驱动程序中处理硬件,你可能确实希望 vtables 来解决硬件变体,这给出了另一个原因以不同的方式实现这种代码。]

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

结合const 和volatile 仅仅意味着不能优化读取,并且不允许编译器更新*this 的成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2012-08-15
    • 2016-12-14
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2016-08-17
    相关资源
    最近更新 更多