volatile
кажется бесконечным вопросом каждого. Я думал, что знаю все об этом, но потом я столкнулся с этим:
Итак, у меня есть раздел памяти между потоками, и я определил его так:
volatile type *name;
Если это заставляет вас чувствовать себя лучше, вы можете представить, что type
это просто int
.
Это означает, что у меня есть указатель (который не является изменчивым) на некоторые данные, которые являются изменчивыми. Так, например, когда речь идет об оптимизации, компилятор может кэшировать значение name
, но не name[0]
. Я прав?
Итак, теперь я vfree
использую этот указатель (он находится в модуле ядра Linux), и он говорит мне, что vfree
ожидает const void *
, пока я передаю его volatile type *
.
Я понимаю, как опасно передавать volatile type *
как type *
, потому что в этой функции значения name[i]
могут кэшироваться (в результате оптимизации), что нежелательно.
Я не понимаю, почему, однако, vfree
ожидает, что я обязательно отправлю ему указатель на энергонезависимые данные. Есть ли что-то, чего мне там не хватает? Или это просто парни, которые написали vfree
, не думая об этой ситуации?
Полагаю, простое приведение указателя на void *
не повредит, верно?