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