0

我脑袋抽筋:

struct MyStruct
{
    int x;

    ...

    inline int getX1() const { return x; }
    inline int getX2() const volatile { return x; }
};

volatile MyStruct myStruct;

我知道编译器会让我调用 myStruct.getX2() 而不会让我调用myStruct.getX1(),因为在 volatile 结构/类上调用的方法必须volatile在这些方法上有限定符。

这是我的问题:如果我创建了这样一个类,并发布它以供其他软件例程使用,我会在方法上添加或不添加 volatile 限定符的原因是什么?

是因为标记的方法volatile告诉编译器不要假设它的任何成员不是volatile,为了优化目的,而如果一个方法没有标记volatile,那么任何没有标记的成员volatile都可以优化?

4

2 回答 2

3

该标准不volatile为任何标准类提供成员函数,因此在正常情况下您也不应该。

您对上一段中的含义是正确的-就像const成员函数一样,volatile成员函数this中是指向易失性的指针。因此,无论您的实现如何实现易失性内存访问(禁用各种优化,对于初学者),它都会通过this.

我怀疑只值得volatile为一个包装了一些实际上可能是易失性或可能不是易失性的内存的类提供成员函数。然后用户可以根据需要创建一个对象volatile或非volatile对象。如果内存肯定需要是易失性的,那么我认为你最好使用volatile具有volatile数据成员的非对象。

现在我试图想象一个真正的用途——一个“计数器”类,它可以在一个由硬件或你编写的中断更新的魔法地址之上创建(在这种情况下,你可以创建一个 volatile放置新的实例),但也有一个用例,它只能通过“普通”代码的调用来更新(在这种情况下,它可以是一个非易失性实例)。在这两种情况下,您可能只会承受使数据成员易失的“性能损失”,因为它没有其他危害。但是您可以提供包含相同代码的成员函数的volatilevolatile版本,其中一个将被优化而另一个则不会。

于 2012-01-25T17:06:08.207 回答
1

是否因为标记为 volatile 的方法告诉编译器不要假设其任何成员都不是 volatile 以进行优化,而如果方法未标记为 volatile,则可以优化任何未标记为 volatile 的成员?

是的。

volatile函数中,*this对象变为volatile,这意味着类的每个非静态成员都变为volatile,就像在const函数中一样,*this对象变为const,进而意味着类的每个非静态成员变为const

话虽如此,编译不会积极优化涉及volatile函数成员的代码。

于 2012-01-25T17:05:11.483 回答