![](/img/trans.png)
[英]how to design overloaded member functions with const and volatile while designing API?
[英]Member functions that are volatile and const
我碰到这个帖子这其中试图解释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"}
};
如果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
) -顺便说一下, const_cast
也可以用来消除不稳定性。
将const
和volatile
组合在一起仅意味着无法优化读取,并且不允许编译器更新*this
的成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.