Освобождающий (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 значение в регистре процессора).

Основываясь на этом значении, функция будет:

  1. вызвать SLAB/SLUB, чтобы освободить память
  2. удалить отображение памяти

Так что да, приведение к void * не причинит никакого вреда во время выполнения.

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