Функции-члены 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
это может привести к неопределенному поведению в некоторых случаях.
Итак, используя исходный пример:
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
}
};