释放(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
值传递)。
基于该值,该函数将:
- 调用SLAB / SLUB释放内存
- 删除内存映射
所以是的,转换为void *
不会在运行时造成任何伤害。
我的结论是,只是将指针转换为void *
不会导致问题,而free
和vfree
不直接接受指向volatile
数据的指针这一事实只是被忽略了。