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 функция.

Другие вопросы по тегам