Функции-члены c++ volatile

class MyClass
{
    int x, y;
    void foo() volatile {
        // do stuff with x
        // do stuff with y
    }   
};

мне нужно объявить x и y as volatile или все переменные-члены будут рассматриваться как volatile автоматически?

Я хочу убедиться ,что " материал с x "не переупорядочивается с" материалом с y" компилятором.

изменить: Что произойдет, если я бросаю нормальный тип в volatile тип? Это компилятор не порядок доступа к этому месту? Я хочу передать нормальную переменную в специальной ситуации функции какой параметр является изменчивым. Я должен быть уверен, что компилятор не переупорядочивает этот вызов с предыдущими или последующими чтениями и записями.

5 ответов


маркировка функции-члена volatile Это как пометить его const; это означает, что объект receiver обрабатывается так, как если бы он был объявлен как volatile T*. Следовательно, любая ссылка на x или y будет рассматриваться как volatile читать в функции-члене. Кроме того,volatile объект может вызывать только volatile функции-члены.

тем не менее, вы можете отметить x и y volatile в любом случае, если вы действительно хотите, чтобы все обращения к ним будут относиться как volatile.


вы не необходимо явно объявить переменные-члены..

из стандартных документов 9.3.2.3,

аналогично, volatile семантика (7.1.6.1) применить в функциях-членах volatile при доступе к объекту и его нестатическому член данных.


следующий код:

#include <iostream>

class Bar
{
    public:

        void test();
};

class Foo
{
    public:

        void test() volatile { x.test(); }

    private:

        Bar x;
};

int main()
{
    Foo foo;

    foo.test();

    return 0;
}

вызывает ошибку при компиляции с gcc:

main.cpp: In member function 'void Foo::test() volatile':
main.cpp:14:33: error: no matching function for call to 'Bar::test() volatile'
main.cpp:7:8: note: candidate is: void Bar::test() <near match>

и с volatile экземпляр не может назвать non-volatile способ, мы можем предположить, что да, x и y будет volatile в методе, даже если экземпляр MyClass не объявлен volatile.

Примечание: Вы можете удалить volatile классификатор с помощью const_cast<> если вам когда-нибудь понадобится; однако будьте осторожны, потому что так же, как const это может привести к неопределенному поведению в некоторых случаях.


IBM не подразумевает он работает точно так же, как функции const.


Итак, используя исходный пример:

class MyClass
{
    int x, y;
    void foo() volatile {
        // do stuff with x
        // do stuff with y
        // with no "non-volatile" optimization of the stuff done with x, y (or anything else)
    }   
    void foo() {
        // do stuff with x
        // do stuff with y
        // the stuff done with x, y (and anything else) may be optimized
    } 
};