C++: const volatile методы
У меня болит мозг:
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
можно оптимизировать?
2 ответа
Стандарт не предусматривает volatile
функции-члены для любых стандартных классов, так что при нормальных обстоятельствах вы не должны.
Вы правы в отношении последствий в последнем абзаце - так же, как с const
функции-члены, в volatile
функция-член this
является указателем на volatile. И поэтому, что бы ваша реализация ни делала для реализации энергозависимого доступа к памяти (для начала отключая различные виды оптимизации), она будет делать это для любых обращений через this
,
Я подозреваю, что это будет только стоит предоставить volatile
функции-члены для класса, который обертывает некоторый объем памяти, который может быть энергозависимым или нет. Затем пользователь может создать volatile
или не volatile
объект в зависимости от обстоятельств. Если память определенно должна быть изменчивой, то я думаю, что вам лучше volatile
объекты, имеющие volatile
элемент данных.
Теперь я пытаюсь представить себе реальное использование - класс "счетчик", который может быть создан поверх магического адреса, который обновляется аппаратным обеспечением или с помощью написанного вами прерывания (в этом случае вы можете создать изменяемый экземпляр с размещением new), но также имеет вариант использования, когда он обновляется только при вызовах из "обычного" кода (в этом случае это может быть энергонезависимый экземпляр). Вы, вероятно, просто приняли бы "снижение производительности", сделав элемент данных изменчивым в обоих случаях, поскольку это не причиняет никакого другого вреда. Но вы могли бы предоставить volatile
и не volatile
версии функций-членов, содержащие идентичный код, один из которых будет оптимизирован, а другой нет.
Это потому, что метод с тегом volatile говорит компилятору, что для оптимизации не следует полагать, что какой-либо из его элементов не является энергозависимым, тогда как, если метод не помечен как volatile, можно оптимизировать любые элементы, не помеченные как volatile.
Да.
В volatile
функция, *this
объект становится volatile
что в свою очередь означает, что каждый нестатический член класса становится volatile
так же, как в const
функция, *this
объект становится const
что в свою очередь означает, что каждый нестатический член класса становится const
,
Сказав, что компиляция воздерживается от агрессивной оптимизации кода с участием членов в volatile
функция.