释放(vfree-ing)指向易失性数据的指针

volatile似乎是每个人永无止境的问题。 我以为我知道一切,但后来我遇到了这个:

所以,我在线程之间共享了一块内存,我将其定义如下:

 volatile type *name; 

如果它让你感觉更好,你可以想象type只是一个int

这意味着我有一些指针(不易变)到一些易失的数据。 因此,例如在优化方面,编译器可以缓存name的值而不是name[0] 。 我对吗?

所以,现在我正在使用这个指针(它在Linux内核模块中),它告诉我当我传递volatile type *时, vfree需要const void * volatile type *

我理解将volatile type *作为type *传递是多么危险,因为在该函数中, name[i]的值可以被高速缓存(作为优化的结果),这是不可取的。

我不明白为什么,但是, vfree希望我将指针发送到非易失性数据。 那里有什么我想念的吗? 或者只是那些写vfree而不考虑这种情况的人?

我假设我只是将我的指针投射到void *不会造成任何伤害,是吗?

vfree函数(以及一般的每个合理的释放函数)并不关心您的实际数据(无论是否为volatile )。 它只需要一个(有效)指针(想一想:将指针作为CPU寄存器中的long值传递)。

基于该值,该函数将:

  1. 调用SLAB / SLUB释放内存
  2. 删除内存映射

所以是的,转换为void *不会在运行时造成任何伤害。

我的结论是,只是将指针转换为void *不会导致问题,而freevfree不直接接受指向volatile数据的指针这一事实只是被忽略了。