volatile
似乎是每个人永无止境的问题。我以为我知道一切,但后来遇到了这个:
所以,我在线程之间共享了一块内存,我将它定义为:
volatile type *name;
如果它让你感觉更好,你可以想象type
只是int
。
这意味着我有一些易失性数据指针(不易变)。因此,例如,在优化方面,编译器可以缓存name
但不缓存name[0]
的值。我是对的吗?
所以,现在我vfree
这个指针(它在Linux内核模块中)它告诉我vfree
期待const void *
我传递它volatile type *
我理解将volatile type *
作为type *
传递是多么危险,因为在该函数中,name[i]
的值可以被缓存(作为优化的结果),这是不可取。
我不明白为什么,vfree
希望我将指针发送到非易失性数据。那里有什么我想念的吗?或者只是那些写vfree
没有考虑过这种情况的人?
我认为我只是将我的指针投向void *
不会造成任何伤害,是吗?
答案 0 :(得分:2)
vfree
函数(以及一般的每个合理的释放函数)并不关心您的实际数据(无论是volatile
还是long
)。它只需要一个(有效)指针(想一想:将指针作为void *
值传递给CPU寄存器。)
根据该值,该函数将:
所以是的,投射到{{1}}不会在运行时造成任何伤害。
答案 1 :(得分:0)
我的结论是,仅将指针转换为void *
不会导致问题,free
和vfree
不会直接接受指向volatile
数据的指针只是被忽视了。